Skip to content

Commit 5dbfd38

Browse files
chinglee-iotUbuntukar-rahul-awsSkptakaggarg
authored
Add coverity example (#870)
* Add coverity example * Update for CI * Fix for CI 2 * Update kernel_misra.config * Rename coverity example to coverity * Update FreeRTOSConfig.h for coverity project * Update MISRA.md * Move coverity config to coverity_misra.config * Update coverity misra config * Add README.md file * Update FreeRTOSConfig.h for coverity * Fix uncrustify and spell * Update README.md for relative link path Update README.md for relative link path * Update README.md for relative link 2 * Update MISRA.md for relateive path * Fix for format * Update coverity_misra.config * Update configuration folder * Update README.md for link * Code review suggestions Signed-off-by: Gaurav Aggarwal <[email protected]> --------- Signed-off-by: Gaurav Aggarwal <[email protected]> Co-authored-by: Ubuntu <[email protected]> Co-authored-by: Rahul Kar <[email protected]> Co-authored-by: Soren Ptak <[email protected]> Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]> Co-authored-by: Gaurav Aggarwal <[email protected]>
1 parent ac7fc39 commit 5dbfd38

File tree

7 files changed

+343
-44
lines changed

7 files changed

+343
-44
lines changed

.github/scripts/kernel_checker.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@
6262
'.bat',
6363
'.sh',
6464
'.txt',
65-
'.cmake'
65+
'.cmake',
66+
'.config'
6667
]
6768

6869
KERNEL_ASM_EXTENSIONS = [

MISRA.md

Lines changed: 2 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ has to be efficient. To achieve that and to increase the performance, it
88
deviates from some MISRA rules. The specific deviations, suppressed inline,
99
are listed below.
1010

11-
Additionally, [MISRA configuration](#misra-configuration) contains project
12-
wide deviations.
11+
Additionally, [MISRA configuration file](examples/coverity/coverity_misra.config)
12+
contains project wide deviations.
1313

1414
### Suppressed with Coverity Comments
1515
To find the violation references in the source files run grep on the source code
@@ -116,39 +116,3 @@ _Ref 21.6.1_
116116
- The Standard Library function snprintf is used in vTaskListTasks and
117117
vTaskGetRunTimeStatistics APIs, both of which are utility functions only and
118118
are not considered part of core kernel implementation.
119-
120-
### MISRA configuration
121-
122-
Copy below content to `misra.conf` to run Coverity on FreeRTOS-Kernel.
123-
124-
```
125-
// MISRA C-2012 Rules
126-
{
127-
version : "2.0",
128-
standard : "c2012",
129-
title: "Coverity MISRA Configuration",
130-
deviations : [
131-
// Disable the following rules.
132-
{
133-
deviation: "Directive 4.8",
134-
reason: "HeapRegion_t and HeapStats_t are used only in heap files but declared in portable.h which is included in multiple source files. As a result, these definitions appear in multiple source files where they are not used."
135-
},
136-
{
137-
deviation: "Directive 4.9",
138-
reason: "FreeRTOS-Kernel is optimised to work on small micro-controllers. To achieve that, function-like macros are used."
139-
},
140-
{
141-
deviation: "Rule 1.2",
142-
reason: "The __attribute__ tags are used via macros which are defined in port files."
143-
},
144-
{
145-
deviation: "Rule 3.1",
146-
reason: "We post HTTP links in code comments which contain // inside comments blocks."
147-
},
148-
{
149-
deviation: "Rule 8.7",
150-
reason: "API functions are not used by the library outside of the files they are defined; however, they must be externally visible in order to be used by an application."
151-
}
152-
]
153-
}
154-
```

examples/cmake_example/main.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,17 +33,16 @@
3333
* https://freertos.org/FreeRTOS-quick-start-guide.html
3434
*/
3535

36+
/* FreeRTOS includes. */
3637
#include <FreeRTOS.h>
3738
#include <task.h>
3839
#include <queue.h>
3940
#include <timers.h>
4041
#include <semphr.h>
4142

43+
/* Standard includes. */
4244
#include <stdio.h>
4345

44-
static StaticTask_t exampleTaskTCB;
45-
static StackType_t exampleTaskStack[ configMINIMAL_STACK_SIZE ];
46-
4746
void exampleTask( void * parameters )
4847
{
4948
/* Unused parameters. */
@@ -55,18 +54,22 @@ void exampleTask( void * parameters )
5554
vTaskDelay( 100 ); /* delay 100 ticks */
5655
}
5756
}
57+
/*-----------------------------------------------------------*/
5858

5959
void main( void )
6060
{
61+
static StaticTask_t exampleTaskTCB;
62+
static StackType_t exampleTaskStack[ configMINIMAL_STACK_SIZE ];
63+
6164
printf( "Example FreeRTOS Project\n" );
6265

6366
xTaskCreateStatic( exampleTask,
6467
"example",
6568
configMINIMAL_STACK_SIZE,
6669
NULL,
6770
configMAX_PRIORITIES - 1,
68-
exampleTaskStack,
69-
&exampleTaskTCB );
71+
&( exampleTaskStack[ 0 ] ),
72+
&( exampleTaskTCB ) );
7073

7174
/* Start the scheduler. */
7275
vTaskStartScheduler();
@@ -76,6 +79,7 @@ void main( void )
7679
/* Should not reach here. */
7780
}
7881
}
82+
/*-----------------------------------------------------------*/
7983

8084
void vApplicationStackOverflowHook( TaskHandle_t xTask,
8185
char * pcTaskName )
@@ -85,3 +89,4 @@ void vApplicationStackOverflowHook( TaskHandle_t xTask,
8589
( void ) xTask;
8690
( void ) pcTaskName;
8791
}
92+
/*-----------------------------------------------------------*/

examples/coverity/CMakeLists.txt

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
cmake_minimum_required(VERSION 3.15)
2+
3+
project(coverity)
4+
5+
set(FREERTOS_KERNEL_PATH "../../")
6+
FILE(GLOB FREERTOS_KERNEL_SOURCE ${FREERTOS_KERNEL_PATH}*.c)
7+
8+
# Coverity incorrectly infers the type of pdTRUE and pdFALSE as boolean because
9+
# of their names. This generates multiple false positive warnings about type
10+
# mismatch. Replace pdTRUE with pdPASS and pdFALSE with pdFAIL to avoid these
11+
# false positive warnings. This workaround will not be needed after Coverity
12+
# fixes the issue of incorrectly inferring the type of pdTRUE and pdFALSE as
13+
# boolean.
14+
add_custom_target(fix_source ALL
15+
COMMAND sed -i -b -e 's/pdFALSE/pdFAIL/g' -e 's/pdTRUE/pdPASS/g' ${FREERTOS_KERNEL_SOURCE}
16+
DEPENDS ${FREERTOS_KERNEL_SOURCE})
17+
18+
# Add the freertos_config for FreeRTOS-Kernel.
19+
add_library(freertos_config INTERFACE)
20+
21+
target_include_directories(freertos_config
22+
INTERFACE
23+
./)
24+
25+
# Select the heap. Values between 1-5 will pick a heap.
26+
set(FREERTOS_HEAP "3" CACHE STRING "" FORCE)
27+
28+
# Select the FreeRTOS port.
29+
set(FREERTOS_PORT "TEMPLATE" CACHE STRING "" FORCE)
30+
31+
# Add the FreeRTOS-Kernel subdirectory.
32+
add_subdirectory(${FREERTOS_KERNEL_PATH} FreeRTOS-Kernel)
33+
34+
add_executable(${PROJECT_NAME}
35+
../cmake_example/main.c)
36+
37+
add_dependencies(${PROJECT_NAME} fix_source)
38+
39+
target_link_libraries(${PROJECT_NAME} freertos_kernel freertos_config)

examples/coverity/FreeRTOSConfig.h

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
/*
2+
* FreeRTOS Kernel <DEVELOPMENT BRANCH>
3+
* Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4+
*
5+
* SPDX-License-Identifier: MIT
6+
*
7+
* Permission is hereby granted, free of charge, to any person obtaining a copy of
8+
* this software and associated documentation files (the "Software"), to deal in
9+
* the Software without restriction, including without limitation the rights to
10+
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
11+
* the Software, and to permit persons to whom the Software is furnished to do so,
12+
* subject to the following conditions:
13+
*
14+
* The above copyright notice and this permission notice shall be included in all
15+
* copies or substantial portions of the Software.
16+
*
17+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
19+
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
20+
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
21+
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22+
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23+
*
24+
* https://www.FreeRTOS.org
25+
* https://github.com/FreeRTOS
26+
*
27+
*/
28+
29+
#ifndef FREERTOS_CONFIG_H
30+
#define FREERTOS_CONFIG_H
31+
32+
/******************************************************************************/
33+
/* Hardware description related definitions. **********************************/
34+
/******************************************************************************/
35+
36+
#define configCPU_CLOCK_HZ ( ( unsigned long ) 20000000 )
37+
38+
/******************************************************************************/
39+
/* Scheduling behaviour related definitions. **********************************/
40+
/******************************************************************************/
41+
42+
#define configTICK_RATE_HZ ( 100U )
43+
#define configUSE_PREEMPTION 1
44+
#define configUSE_TIME_SLICING 1
45+
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0
46+
#define configUSE_TICKLESS_IDLE 1
47+
#define configMAX_PRIORITIES 5U
48+
#define configMINIMAL_STACK_SIZE 128U
49+
#define configMAX_TASK_NAME_LEN 4U
50+
#define configTICK_TYPE_WIDTH_IN_BITS TICK_TYPE_WIDTH_64_BITS
51+
#define configIDLE_SHOULD_YIELD 1
52+
#define configTASK_NOTIFICATION_ARRAY_ENTRIES 1U
53+
#define configQUEUE_REGISTRY_SIZE 0U
54+
#define configENABLE_BACKWARD_COMPATIBILITY 1
55+
#define configNUM_THREAD_LOCAL_STORAGE_POINTERS 0
56+
#define configSTACK_DEPTH_TYPE size_t
57+
#define configMESSAGE_BUFFER_LENGTH_TYPE size_t
58+
#define configUSE_NEWLIB_REENTRANT 0
59+
60+
/******************************************************************************/
61+
/* Software timer related definitions. ****************************************/
62+
/******************************************************************************/
63+
64+
#define configUSE_TIMERS 1
65+
#define configTIMER_TASK_PRIORITY ( configMAX_PRIORITIES - 1U )
66+
#define configTIMER_TASK_STACK_DEPTH configMINIMAL_STACK_SIZE
67+
#define configTIMER_QUEUE_LENGTH 10U
68+
69+
/******************************************************************************/
70+
/* Memory allocation related definitions. *************************************/
71+
/******************************************************************************/
72+
73+
#define configSUPPORT_STATIC_ALLOCATION 1
74+
#define configSUPPORT_DYNAMIC_ALLOCATION 1
75+
#define configTOTAL_HEAP_SIZE 4096U
76+
#define configAPPLICATION_ALLOCATED_HEAP 1
77+
#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP 0
78+
#define configUSE_MINI_LIST_ITEM 0
79+
80+
/******************************************************************************/
81+
/* Interrupt nesting behaviour configuration. *********************************/
82+
/******************************************************************************/
83+
84+
#define configKERNEL_INTERRUPT_PRIORITY 0U
85+
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 0U
86+
#define configMAX_API_CALL_INTERRUPT_PRIORITY 0U
87+
88+
/******************************************************************************/
89+
/* Hook and callback function related definitions. ****************************/
90+
/******************************************************************************/
91+
92+
#define configUSE_IDLE_HOOK 0
93+
#define configUSE_TICK_HOOK 0
94+
#define configUSE_MALLOC_FAILED_HOOK 0
95+
#define configUSE_DAEMON_TASK_STARTUP_HOOK 0
96+
#define configCHECK_FOR_STACK_OVERFLOW 0
97+
98+
/******************************************************************************/
99+
/* Run time and task stats gathering related definitions. *********************/
100+
/******************************************************************************/
101+
102+
#define configGENERATE_RUN_TIME_STATS 0
103+
#define configUSE_TRACE_FACILITY 0
104+
#define configUSE_STATS_FORMATTING_FUNCTIONS 0
105+
#define configKERNEL_PROVIDED_STATIC_MEMORY 1
106+
107+
/******************************************************************************/
108+
/* Definitions that include or exclude functionality. *************************/
109+
/******************************************************************************/
110+
111+
#define configUSE_TASK_NOTIFICATIONS 1
112+
#define configUSE_MUTEXES 1
113+
#define configUSE_RECURSIVE_MUTEXES 1
114+
#define configUSE_COUNTING_SEMAPHORES 1
115+
#define configUSE_QUEUE_SETS 1
116+
#define configUSE_APPLICATION_TASK_TAG 1
117+
#define INCLUDE_vTaskPrioritySet 1
118+
#define INCLUDE_uxTaskPriorityGet 1
119+
#define INCLUDE_vTaskDelete 1
120+
#define INCLUDE_vTaskSuspend 1
121+
#define INCLUDE_xResumeFromISR 1
122+
#define INCLUDE_vTaskDelayUntil 1
123+
#define INCLUDE_vTaskDelay 1
124+
#define INCLUDE_xTaskGetSchedulerState 1
125+
#define INCLUDE_xTaskGetCurrentTaskHandle 1
126+
#define INCLUDE_uxTaskGetStackHighWaterMark 1
127+
#define INCLUDE_xTaskGetIdleTaskHandle 1
128+
#define INCLUDE_eTaskGetState 1
129+
#define INCLUDE_xEventGroupSetBitFromISR 1
130+
#define INCLUDE_xTimerPendFunctionCall 1
131+
#define INCLUDE_xTaskAbortDelay 1
132+
#define INCLUDE_xTaskGetHandle 1
133+
#define INCLUDE_xTaskResumeFromISR 1
134+
135+
#endif /* FREERTOS_CONFIG_H */

examples/coverity/README.md

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
# MISRA Compliance for FreeRTOS-Kernel
2+
FreeRTOS-Kernel is MISRA C:2012 compliant. This directory contains a project to
3+
run [Synopsys Coverity](https://www.synopsys.com/software-integrity/security-testing/static-analysis-sast.html)
4+
for checking MISRA compliance.
5+
6+
> **Note**
7+
Coverity version 2022.6.1 incorrectly infers the type of `pdTRUE` and `pdFALSE`
8+
as boolean because of their names, resulting in multiple false positive warnings
9+
about type mismatch. We replace `pdTRUE` with `pdPASS` and `pdFALSE` with
10+
`pdFAIL` to avoid these false positive warnings. This workaround will not be
11+
needed after Coverity fixes the issue of incorrectly inferring the type of
12+
`pdTRUE` and `pdFALSE` as boolean.
13+
14+
Deviations from the MISRA C:2012 guidelines are documented in
15+
[MISRA.md](../../MISRA.md) and [coverity_misra.config](coverity_misra.config)
16+
files.
17+
18+
## Getting Started
19+
### Prerequisites
20+
Coverity can be run on any platform mentioned [here](https://sig-docs.synopsys.com/polaris/topics/c_coverity-compatible-platforms.html).
21+
The following are the prerequisites to generate coverity report:
22+
23+
1. CMake version > 3.13.0 (You can check whether you have this by typing `cmake --version`).
24+
2. GCC compiler.
25+
- See download and installation instructions [here](https://gcc.gnu.org/install/).
26+
3. Clone the repo using the following command:
27+
- `git clone https://github.com/FreeRTOS/FreeRTOS-Kernel.git ./FreeRTOS-Kernel`
28+
29+
### Generating Report
30+
Go to the root directory of the FreeRTOS-Kernel repo and run the following
31+
commands in a terminal:
32+
1. Update the compiler configuration in Coverity:
33+
~~~
34+
cov-configure --force --compiler cc --comptype gcc
35+
~~~
36+
2. Create the build files using CMake in a `build` directory:
37+
~~~
38+
cmake -B build -S examples/coverity
39+
~~~
40+
3. Build the (pseudo) application:
41+
~~~
42+
cd build/
43+
cov-build --emit-complementary-info --dir cov-out make
44+
~~~
45+
4. Go to the Coverity output directory (`cov-out`) and begin Coverity static
46+
analysis:
47+
~~~
48+
cd cov-out/
49+
cov-analyze --dir ./cov-out \
50+
--coding-standard-config ../examples/coverity/coverity_misra.config \
51+
--tu-pattern "file('.*/FreeRTOS/Source/[A-Za-z_]*\.c')
52+
~~~
53+
5. Generate the HTML report:
54+
~~~
55+
cov-format-errors --dir ./cov-out --html-output html-output
56+
~~~
57+
58+
HTML report should now be generated in a directory named `html-output`.

0 commit comments

Comments
 (0)