-
Notifications
You must be signed in to change notification settings - Fork 61
/
Copy pathCastRemovesConstOrVolatileQualification.ql
32 lines (30 loc) · 1.33 KB
/
CastRemovesConstOrVolatileQualification.ql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/**
* @id c/misra/cast-removes-const-or-volatile-qualification
* @name RULE-11-8: A cast shall not remove any const or volatile qualification from the type pointed to by a pointer
* @description Casting away const or volatile qualifications violates the principle of type
* qualification and can result in unpredictable behaviour.
* @kind problem
* @precision very-high
* @problem.severity error
* @tags external/misra/id/rule-11-8
* correctness
* external/misra/c/2012/third-edition-first-revision
* external/misra/obligation/required
*/
import cpp
import codingstandards.c.misra
from Cast cast, Type baseTypeFrom, Type baseTypeTo, string qualificationName
where
not isExcluded(cast, Pointers1Package::castRemovesConstOrVolatileQualificationQuery()) and
baseTypeFrom = cast.getExpr().getType().(PointerType).getBaseType() and
baseTypeTo = cast.getType().(PointerType).getBaseType() and
(
baseTypeFrom.isVolatile() and not baseTypeTo.isVolatile() and qualificationName = "volatile"
or
baseTypeFrom.isConst() and not baseTypeTo.isConst() and qualificationName = "const"
or
baseTypeFrom.hasSpecifier("atomic") and
not baseTypeTo.hasSpecifier("atomic") and
qualificationName = "atomic"
)
select cast, "Cast of pointer removes " + qualificationName + " qualification from its base type."