|
6 | 6 | * @precision very-high |
7 | 7 | * @problem.severity error |
8 | 8 | * @tags external/cert/id/sig31-c |
| 9 | + * correctness |
| 10 | + * security |
9 | 11 | * external/cert/obligation/rule |
10 | 12 | */ |
11 | 13 |
|
12 | 14 | import cpp |
13 | 15 | import codingstandards.c.cert |
| 16 | +import codingstandards.c.Signal |
14 | 17 |
|
15 | | -from |
| 18 | +/** |
| 19 | + * Does not an access an external variable except |
| 20 | + * to assign a value to a volatile static variable of sig_atomic_t type |
| 21 | + */ |
| 22 | +class UnsafeSharedVariableAccess extends VariableAccess { |
| 23 | + UnsafeSharedVariableAccess() { |
| 24 | + // static or thread local storage duration |
| 25 | + ( |
| 26 | + this.getTarget() instanceof StaticStorageDurationVariable or |
| 27 | + this.getTarget().isThreadLocal() |
| 28 | + ) and |
| 29 | + // excluding `volatile sig_atomic_t` type |
| 30 | + not ( |
| 31 | + this.getType().hasName("volatile sig_atomic_t") and // TODO search without "volatile" |
| 32 | + this.getTarget().isVolatile() |
| 33 | + ) and //excluding lock-free atomic objects |
| 34 | + not exists(MacroInvocation mi, VariableAccess va | |
| 35 | + mi.getMacroName() = "atomic_is_lock_free" and |
| 36 | + mi.getExpr().getChild(0) = va.getEnclosingElement*() and |
| 37 | + va.getTarget() = this.getTarget() |
| 38 | + ) |
| 39 | + } |
| 40 | +} |
| 41 | + |
| 42 | +from UnsafeSharedVariableAccess va, SignalHandler handler |
16 | 43 | where |
17 | | - not isExcluded(x, SignalHandlersPackage::doNotAccessSharedObjectsInSignalHandlersQuery()) and |
18 | | -select |
| 44 | + not isExcluded(va, SignalHandlersPackage::doNotAccessSharedObjectsInSignalHandlersQuery()) and |
| 45 | + handler = va.getEnclosingFunction() |
| 46 | +select va, "Shared object access within a $@ can lead to undefined behavior.", |
| 47 | + handler.getRegistration(), "signal handler" |
0 commit comments