LTS complexity score

I read in the LTS roadmap that to get into an LTS the code has to meet the following constraint:

All functions will have a GNU Complexity score of 8 or lower

I downloaded the current LTS snapshot and saw that the kernel version contained in it is 10.3.0. I cloned this version from the github repository and ran complexity on it with the following results:

$ complexity -c -h -t9 `find -name "*.c"`
procedure xEventGroupCreateStatic in ./event_groups.c ended before final close bracket
NOTE: proc xEventGroupWaitBits in file ./event_groups.c line 285
	nesting depth reached level 6
procedure xEventGroupClearBitsFromISR in ./event_groups.c ended before final close bracket
NOTE: proc xEventGroupSetBits in file ./event_groups.c line 490
	nesting depth reached level 5
procedure xTimerCreate in ./timers.c ended before final close bracket
NOTE: proc prvProcessTimerOrBlockTask in file ./timers.c line 555
	nesting depth reached level 5
NOTE: proc prvProcessReceivedCommands in file ./timers.c line 705
	nesting depth reached level 6
NOTE: proc prvCheckForValidListAndQueue in file ./timers.c line 907
	nesting depth reached level 5
NOTE: proc prvCheckDelayedList in file ./croutine.c line 212
	nesting depth reached level 5
procedure xTaskCreateStatic in ./tasks.c ended before final close bracket
NOTE: proc prvAddNewTaskToReadyList in file ./tasks.c line 960
	nesting depth reached level 5
procedure vTaskDelete in ./tasks.c ended before final close bracket
procedure prvGetExpectedIdleTime in ./tasks.c ended before final close bracket
NOTE: proc prvSearchForNameWithinSingleList in file ./tasks.c line 2247
	nesting depth reached level 5
procedure prvSearchForNameWithinSingleList in ./tasks.c ended before final close bracket
procedure xTaskGetHandle in ./tasks.c ended before final close bracket
NOTE: proc xTaskAbortDelay in file ./tasks.c line 2497
	nesting depth reached level 5
procedure xTaskAbortDelay in ./tasks.c ended before final close bracket
procedure vTaskSetApplicationTaskTag in ./tasks.c ended before final close bracket
procedure vTaskPlaceOnEventListRestricted in ./tasks.c ended before final close bracket
procedure uxTaskGetTaskNumber in ./tasks.c ended before final close bracket
procedure eTaskConfirmSleepModeStatus in ./tasks.c ended before final close bracket
NOTE: proc vTaskGetInfo in file ./tasks.c line 3523
	nesting depth reached level 7
==>	*seriously consider rewriting the procedure*.
procedure vTaskGetInfo in ./tasks.c ended before final close bracket
procedure xTaskGetCurrentTaskHandle in ./tasks.c ended before final close bracket
procedure pvTaskIncrementMutexHeldCount in ./tasks.c ended before final close bracket
procedure xStreamBufferGenericCreate in ./stream_buffer.c ended before final close bracket
NOTE: proc xStreamBufferReset in file ./stream_buffer.c line 365
	nesting depth reached level 5
NOTE: proc xStreamBufferSend in file ./stream_buffer.c line 476
	nesting depth reached level 5
NOTE: proc pvPortMalloc in file ./portable/MemMang/heap_4.c line 103
	nesting depth reached level 6
NOTE: proc vPortFree in file ./portable/MemMang/heap_4.c line 252
	nesting depth reached level 5
NOTE: proc vPortGetHeapStats in file ./portable/MemMang/heap_4.c line 428
	nesting depth reached level 5
NOTE: proc pvPortMalloc in file ./portable/MemMang/heap_5.c line 125
	nesting depth reached level 6
NOTE: proc vPortFree in file ./portable/MemMang/heap_5.c line 264
	nesting depth reached level 5
NOTE: proc vPortGetHeapStats in file ./portable/MemMang/heap_5.c line 480
	nesting depth reached level 6
NOTE: proc pvPortMalloc in file ./portable/MemMang/heap_2.c line 105
	nesting depth reached level 5
end of pxPortInitialiseStack() in ./portable/MPLAB/PIC24_dsPIC/port.c reached with open control blocks
unscored: pxPortInitialiseStack in ./portable/MPLAB/PIC24_dsPIC/port.c on line 135
procedure vPortNonPreemptiveTick in ./portable/CCS/ARM_Cortex-R4/port.c ended before final close bracket
procedure vPortSuppressTicksAndSleep in ./portable/CCS/ARM_CM3/port.c ended before final close bracket
procedure vPortSuppressTicksAndSleep in ./portable/CCS/ARM_CM4F/port.c ended before final close bracket
procedure prvPreemptiveTick in ./portable/Paradigm/Tern_EE/large_untested/port.c ended before final close bracket
procedure prvPreemptiveTick in ./portable/Paradigm/Tern_EE/small/port.c ended before final close bracket
procedure prvSetupMPU in ./portable/ARMv8M/non_secure/port.c ended before final close bracket
procedure vPortStoreTaskMPUSettings in ./portable/ARMv8M/non_secure/port.c ended before final close bracket
NOTE: proc SecureContext_AllocateContext in file ./portable/ARMv8M/secure/context/secure_context.c line 92
	nesting depth reached level 6
NOTE: proc pvPortMalloc in file ./portable/ARMv8M/secure/heap/secure_heap.c line 223
	nesting depth reached level 5
NOTE: proc vPortFree in file ./portable/ARMv8M/secure/heap/secure_heap.c line 367
	nesting depth reached level 5
procedure vTickISR in ./portable/GCC/H8S2329/port.c ended before final close bracket
procedure prvSetupMPU in ./portable/GCC/ARM_CM23/non_secure/port.c ended before final close bracket
procedure vPortStoreTaskMPUSettings in ./portable/GCC/ARM_CM23/non_secure/port.c ended before final close bracket
NOTE: proc SecureContext_AllocateContext in file ./portable/GCC/ARM_CM23/secure/secure_context.c line 92
	nesting depth reached level 6
NOTE: proc pvPortMalloc in file ./portable/GCC/ARM_CM23/secure/secure_heap.c line 223
	nesting depth reached level 5
NOTE: proc vPortFree in file ./portable/GCC/ARM_CM23/secure/secure_heap.c line 367
	nesting depth reached level 5
procedure vPortTaskUsesFPU in ./portable/GCC/IA32_flat/port.c ended before final close bracket
procedure vPortCentralInterruptHandler in ./portable/GCC/IA32_flat/port.c ended before final close bracket
procedure vPortSuppressTicksAndSleep in ./portable/GCC/ARM_CM3/port.c ended before final close bracket
procedure vPortDisableInterruptsFromThumb in ./portable/GCC/STR75x/portISR.c ended before final close bracket
procedure vNonPreemptiveTick in ./portable/GCC/ARM7_LPC23xx/portISR.c ended before final close bracket
procedure vPortTaskUsesFPU in ./portable/GCC/ARM_CA9/port.c ended before final close bracket
procedure vPortValidateInterruptPriority in ./portable/GCC/ARM_CA9/port.c ended before final close bracket
procedure vPortSuppressTicksAndSleep in ./portable/GCC/ARM_CM7/r0p1/port.c ended before final close bracket
procedure vPortSuppressTicksAndSleep in ./portable/GCC/ARM_CM4F/port.c ended before final close bracket
procedure vPortDisableInterruptsFromThumb in ./portable/GCC/ARM7_LPC2000/portISR.c ended before final close bracket
procedure prvSetupMPU in ./portable/GCC/ARM_CM23_NTZ/non_secure/port.c ended before final close bracket
procedure vPortStoreTaskMPUSettings in ./portable/GCC/ARM_CM23_NTZ/non_secure/port.c ended before final close bracket
procedure prvSetupMPU in ./portable/GCC/ARM_CM33/non_secure/port.c ended before final close bracket
procedure vPortStoreTaskMPUSettings in ./portable/GCC/ARM_CM33/non_secure/port.c ended before final close bracket
NOTE: proc SecureContext_AllocateContext in file ./portable/GCC/ARM_CM33/secure/secure_context.c line 92
	nesting depth reached level 6
NOTE: proc pvPortMalloc in file ./portable/GCC/ARM_CM33/secure/secure_heap.c line 223
	nesting depth reached level 5
NOTE: proc vPortFree in file ./portable/GCC/ARM_CM33/secure/secure_heap.c line 367
	nesting depth reached level 5
procedure prvScheduleFirstTick in ./portable/GCC/AVR32_UC3/port.c ended before final close bracket
procedure vNonPreemptiveTick in ./portable/GCC/ARM7_AT91FR40008/portISR.c ended before final close bracket
procedure vNonPreemptiveTick in ./portable/GCC/ARM7_AT91SAM7S/portISR.c ended before final close bracket
procedure vPortSetupTimerInterrupt in ./portable/GCC/RISC-V/port.c ended before final close bracket
procedure prvSetupMPU in ./portable/GCC/ARM_CM33_NTZ/non_secure/port.c ended before final close bracket
procedure vPortStoreTaskMPUSettings in ./portable/GCC/ARM_CM33_NTZ/non_secure/port.c ended before final close bracket
procedure prvPreemptiveTick in ./portable/BCC/16BitDOS/Flsh186/port.c ended before final close bracket
procedure prvPreemptiveTick in ./portable/BCC/16BitDOS/PC/port.c ended before final close bracket
procedure vPortSetupTimerInterrupt in ./portable/RVDS/ARM_CM0/port.c ended before final close bracket
procedure vPortSuppressTicksAndSleep in ./portable/RVDS/ARM_CM3/port.c ended before final close bracket
procedure vPortSuppressTicksAndSleep in ./portable/RVDS/ARM_CM7/r0p1/port.c ended before final close bracket
procedure vPortSuppressTicksAndSleep in ./portable/RVDS/ARM_CM4F/port.c ended before final close bracket
procedure vPortSuppressTicksAndSleep in ./portable/MikroC/ARM_CM4F/port.c ended before final close bracket
procedure vPortSetupTimerInterrupt in ./portable/MikroC/ARM_CM4F/port.c ended before final close bracket
procedure MPU_xTaskCreateRestricted in ./portable/Common/mpu_wrappers.c ended before final close bracket
procedure MPU_vTaskDelete in ./portable/Common/mpu_wrappers.c ended before final close bracket
procedure MPU_xTaskGetHandle in ./portable/Common/mpu_wrappers.c ended before final close bracket
procedure MPU_uxTaskGetStackHighWaterMark in ./portable/Common/mpu_wrappers.c ended before final close bracket
procedure MPU_xTaskGenericNotify in ./portable/Common/mpu_wrappers.c ended before final close bracket
procedure MPU_xQueueGetMutexHolder in ./portable/Common/mpu_wrappers.c ended before final close bracket
procedure MPU_pvPortMalloc in ./portable/Common/mpu_wrappers.c ended before final close bracket
procedure MPU_xStreamBufferGenericCreate in ./portable/Common/mpu_wrappers.c ended before final close bracket
procedure prvRLT0_TICKISR in ./portable/Softune/MB96340/port.c ended before final close bracket
invalid character in ./portable/Softune/MB91460/port.c on line 39: 0x40 (@)
NOTE: proc prvProcessSimulatedInterrupts in file ./portable/MSVC-MingW/port.c line 357
	nesting depth reached level 6
procedure prvSetupMPU in ./portable/IAR/ARM_CM23/non_secure/port.c ended before final close bracket
procedure vPortStoreTaskMPUSettings in ./portable/IAR/ARM_CM23/non_secure/port.c ended before final close bracket
NOTE: proc SecureContext_AllocateContext in file ./portable/IAR/ARM_CM23/secure/secure_context.c line 92
	nesting depth reached level 6
NOTE: proc pvPortMalloc in file ./portable/IAR/ARM_CM23/secure/secure_heap.c line 223
	nesting depth reached level 5
NOTE: proc vPortFree in file ./portable/IAR/ARM_CM23/secure/secure_heap.c line 367
	nesting depth reached level 5
procedure vPortSuppressTicksAndSleep in ./portable/IAR/ARM_CM3/port.c ended before final close bracket
procedure prvFindFactors in ./portable/IAR/STR91x/port.c ended before final close bracket
procedure vPortNonPreemptiveTick in ./portable/IAR/LPC2000/port.c ended before final close bracket
procedure vPortSuppressTicksAndSleep in ./portable/IAR/ARM_CM7/r0p1/port.c ended before final close bracket
procedure vPortSuppressTicksAndSleep in ./portable/IAR/ARM_CM4F/port.c ended before final close bracket
procedure prvSetupMPU in ./portable/IAR/ARM_CM23_NTZ/non_secure/port.c ended before final close bracket
procedure vPortStoreTaskMPUSettings in ./portable/IAR/ARM_CM23_NTZ/non_secure/port.c ended before final close bracket
procedure prvSetupMPU in ./portable/IAR/ARM_CM33/non_secure/port.c ended before final close bracket
procedure vPortStoreTaskMPUSettings in ./portable/IAR/ARM_CM33/non_secure/port.c ended before final close bracket
NOTE: proc SecureContext_AllocateContext in file ./portable/IAR/ARM_CM33/secure/secure_context.c line 92
	nesting depth reached level 6
NOTE: proc pvPortMalloc in file ./portable/IAR/ARM_CM33/secure/secure_heap.c line 223
	nesting depth reached level 5
NOTE: proc vPortFree in file ./portable/IAR/ARM_CM33/secure/secure_heap.c line 367
	nesting depth reached level 5
procedure prvScheduleFirstTick in ./portable/IAR/AVR32_UC3/port.c ended before final close bracket
procedure SIG_OUTPUT_COMPARE1A in ./portable/IAR/ATMega323/port.c ended before final close bracket
procedure vPortNonPreemptiveTick in ./portable/IAR/AtmelSAM7S64/port.c ended before final close bracket
procedure vPortSetupTimerInterrupt in ./portable/IAR/RISC-V/port.c ended before final close bracket
procedure prvSetupMPU in ./portable/IAR/ARM_CM33_NTZ/non_secure/port.c ended before final close bracket
procedure vPortStoreTaskMPUSettings in ./portable/IAR/ARM_CM33_NTZ/non_secure/port.c ended before final close bracket
procedure prvPreemptiveTick in ./portable/oWatcom/16BitDOS/Flsh186/port.c ended before final close bracket
procedure prvPreemptiveTick in ./portable/oWatcom/16BitDOS/PC/port.c ended before final close bracket
invalid character in ./portable/CodeWarrior/ColdFire_V2/port.c on line 47: 0x40 (@)
procedure xQueueGenericCreateStatic in ./queue.c ended before final close bracket
procedure prvInitialiseMutex in ./queue.c ended before final close bracket
NOTE: proc xQueueGenericSendFromISR in file ./queue.c line 909
	nesting depth reached level 9
==>	*seriously consider rewriting the procedure*.
NOTE: proc xQueueGiveFromISR in file ./queue.c line 1068
	nesting depth reached level 9
==>	*seriously consider rewriting the procedure*.
NOTE: proc xQueueReceive in file ./queue.c line 1230
	nesting depth reached level 6
NOTE: proc xQueueSemaphoreTake in file ./queue.c line 1369
	nesting depth reached level 7
==>	*seriously consider rewriting the procedure*.
NOTE: proc xQueuePeek in file ./queue.c line 1575
	nesting depth reached level 6
NOTE: proc xQueueReceiveFromISR in file ./queue.c line 1722
	nesting depth reached level 7
==>	*seriously consider rewriting the procedure*.
procedure uxQueueGetQueueNumber in ./queue.c ended before final close bracket
NOTE: proc prvUnlockQueue in file ./queue.c line 2101
	nesting depth reached level 7
==>	*seriously consider rewriting the procedure*.
Complexity Scores
Score | ln-ct | nc-lns| file-name(line): proc-name
    9      60      44   ./tasks.c(2247): prvSearchForNameWithinSingleList
    9     143      99   ./event_groups.c(285): xEventGroupWaitBits
    9     160     160   ./portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portasm.c(214): PendSV_Handler
    9     160     160   ./portable/GCC/ARM_CM23/non_secure/portasm.c(214): PendSV_Handler
   10      91      68   ./portable/GCC/ARM_CM3_MPU/port.c(637): vPortStoreTaskMPUSettings
   10      91      68   ./portable/IAR/ARM_CM4F_MPU/port.c(516): vPortStoreTaskMPUSettings
   10      93      68   ./portable/RVDS/ARM_CM4_MPU/port.c(687): vPortStoreTaskMPUSettings
   10      97      72   ./portable/GCC/ARM_CM4_MPU/port.c(691): vPortStoreTaskMPUSettings
   12     116      49   ./portable/MSVC-MingW/port.c(357): prvProcessSimulatedInterrupts
   13     159      67   ./portable/MikroC/ARM_CM4F/port.c(431): vPortSuppressTicksAndSleep
   15     134      95   ./queue.c(1230): xQueueReceive
   15     142      97   ./queue.c(1575): xQueuePeek
   17     134      89   ./portable/MemMang/heap_5.c(125): pvPortMalloc
   18     139      94   ./portable/ARMv8M/secure/heap/secure_heap.c(223): pvPortMalloc
   18     139      94   ./portable/GCC/ARM_CM23/secure/secure_heap.c(223): pvPortMalloc
   18     139      94   ./portable/GCC/ARM_CM33/secure/secure_heap.c(223): pvPortMalloc
   18     139      94   ./portable/IAR/ARM_CM23/secure/secure_heap.c(223): pvPortMalloc
   18     139      94   ./portable/IAR/ARM_CM33/secure/secure_heap.c(223): pvPortMalloc
   19     144      99   ./portable/MemMang/heap_4.c(103): pvPortMalloc
   23     201     134   ./queue.c(1369): xQueueSemaphoreTake
   24     138      90   ./timers.c(705): prvProcessReceivedCommands
   26     157     101   ./queue.c(1068): xQueueGiveFromISR
   28     154     106   ./queue.c(909): xQueueGenericSendFromISR

Complexity Histogram
Score-Range  Lin-Ct
    0-9         463 **********************
   10-19       1242 ************************************************************
   20-29        431 *********************

Scored procedure ct:       23
Non-comment line ct:     2136
Average line score:        16
25%-ile score:             10 (75% in higher score procs)
50%-ile score:             17 (half in higher score procs)
75%-ile score:             18 (25% in higher score procs)
Highest score:             28 (xQueueGenericSendFromISR() in ./queue.c)
Unscored procedures:        1

there are a lot of warnings and notes, and some functions that score higher than 8.

so there’s a contradiction. These codes are in LTS despite not respecting the first of the LTS rules.

best regards
Max

What you are looking at is the LTS development snapshot, not the completed LTS versions. I think there is a table on one of the webpages that shows the status of the libraries. The MQTT stack currently being worked on and on which the complexity score is being reduced (in fact, may already be at or below 8 today) is here: https://github.com/aws/aws-iot-device-sdk-embedded-C/tree/development/libraries/standard/mqtt/src These libs will get moved into the snapshot as the criteria are met.

Yes, in the same page FreeRTOS Kernel is “LTS Ready”:

This is the reason for my doubts: if the FreeRTOS kernel is declared to be "LTS ready" it should have a complexity score less than 8. However, he doesn’t, so it should not be “LTS ready”.

I also tried release 10.3.1 and the current master with similar results.

Right, I see your point now. The kernel itself is much more mature and sort of being considered separately to the other libraries. It has been MISRA compliant within the bounds of the description here for many years. The main thing we are doing for the kernel is switching from Lint to Coverity for static checks. Additionally there are ongoing memory safety proof (as per Nathan’s blog posts . Sorry to cause the confusion by not making that clear on the page.