Skip to content

Convert more dataflow queries to the new dataflow library #927

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 19 commits into from
Jul 11, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
import cpp
import codingstandards.c.cert
import codingstandards.cpp.Overflow
import semmle.code.cpp.dataflow.TaintTracking
import semmle.code.cpp.dataflow.new.TaintTracking

/**
* Gets the maximum size (in bytes) a variable-length array
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
import cpp
import codingstandards.c.cert
import codingstandards.c.Objects
import semmle.code.cpp.dataflow.DataFlow
import semmle.code.cpp.dataflow.new.DataFlow

class Source extends Expr {
ObjectIdentity rootObject;
Expand All @@ -34,7 +34,7 @@ class Sink extends DataFlow::Node {
Sink() {
//output parameter
exists(Parameter f |
f.getAnAccess() = this.(DataFlow::PostUpdateNode).getPreUpdateNode().asExpr() and
this.isFinalValueOfParameter(f) and
f.getUnderlyingType() instanceof PointerType
)
or
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import codingstandards.c.cert
import codingstandards.c.Errno
import codingstandards.c.Signal
import semmle.code.cpp.controlflow.Guards
import semmle.code.cpp.dataflow.DataFlow
import semmle.code.cpp.dataflow.new.DataFlow

/**
* A check on `signal` call return value
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import cpp
import codingstandards.c.cert
import semmle.code.cpp.commons.NULL
import codingstandards.cpp.ReadErrorsAndEOF
import semmle.code.cpp.dataflow.DataFlow
import semmle.code.cpp.dataflow.new.DataFlow

ComparisonOperation getAValidComparison(string spec) {
spec = "=0" and result.(EqualityOperation).getAnOperand().getValue() = "0"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

import cpp
import codingstandards.c.cert
import semmle.code.cpp.dataflow.DataFlow
import semmle.code.cpp.dataflow.new.DataFlow
import SuspectFunctionPointerToCallFlow::PathGraph

/**
Expand Down Expand Up @@ -61,7 +61,8 @@ where
not isExcluded(src.getNode().asExpr(),
ExpressionsPackage::doNotCallFunctionPointerWithIncompatibleTypeQuery()) and
access = src.getNode().asExpr() and
SuspectFunctionPointerToCallFlow::flowPath(src, sink)
SuspectFunctionPointerToCallFlow::flowPath(src, sink) and
not access.getType() = sink.getNode().asExpr().getFullyConverted().getType()
select src, src, sink,
"Incompatible function $@ assigned to function pointer is eventually called through the pointer.",
access.getTarget(), access.getTarget().getName()
2 changes: 1 addition & 1 deletion c/cert/src/rules/EXP40-C/DoNotModifyConstantObjects.ql
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

import cpp
import codingstandards.c.cert
import semmle.code.cpp.dataflow.DataFlow
import semmle.code.cpp.dataflow.new.DataFlow
import CastFlow::PathGraph
import codingstandards.cpp.SideEffect

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

import cpp
import codingstandards.c.cert
import semmle.code.cpp.dataflow.DataFlow
import semmle.code.cpp.dataflow.new.DataFlow

class FgetposCall extends FunctionCall {
FgetposCall() { this.getTarget().hasGlobalOrStdName("fgetpos") }
Expand All @@ -30,12 +30,12 @@ class FsetposCall extends FunctionCall {
module FposDFConfig implements DataFlow::ConfigSig {
predicate isSource(DataFlow::Node source) {
// source must be the second parameter of a FgetposCall call
source = DataFlow::definitionByReferenceNodeFromArgument(any(FgetposCall c).getArgument(1))
source.asDefiningArgument() = any(FgetposCall c).getArgument(1)
}

predicate isSink(DataFlow::Node sink) {
// sink must be the second parameter of a FsetposCall call
sink.asExpr() = any(FsetposCall c).getArgument(1)
sink.asIndirectExpr() = any(FsetposCall c).getArgument(1)
}
}

Expand All @@ -45,6 +45,6 @@ from FsetposCall fsetpos
where
not isExcluded(fsetpos.getArgument(1),
IO2Package::onlyUseValuesForFsetposThatAreReturnedFromFgetposQuery()) and
not FposDFFlow::flowToExpr(fsetpos.getArgument(1))
not exists(DataFlow::Node n | n.asIndirectExpr() = fsetpos.getArgument(1) | FposDFFlow::flowTo(n))
select fsetpos.getArgument(1),
"The position argument of a call to `fsetpos()` should be obtained from a call to `fgetpos()`."
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import cpp
import codingstandards.c.cert
import codingstandards.cpp.Overflow
import semmle.code.cpp.controlflow.Guards
import semmle.code.cpp.dataflow.TaintTracking
import semmle.code.cpp.dataflow.new.TaintTracking
import semmle.code.cpp.models.Models

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
import cpp
import codingstandards.c.cert
import codingstandards.cpp.Alignment
import semmle.code.cpp.dataflow.DataFlow
import semmle.code.cpp.dataflow.new.DataFlow
import AlignedAllocToReallocFlow::PathGraph

int getStatedValue(Expr e) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
import cpp
import codingstandards.c.cert
import codingstandards.c.Signal
import semmle.code.cpp.dataflow.DataFlow
import semmle.code.cpp.dataflow.new.DataFlow

/**
* Does not access an external variable except
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
import cpp
import codingstandards.c.cert
import codingstandards.c.Signal
import semmle.code.cpp.dataflow.DataFlow
import semmle.code.cpp.dataflow.new.DataFlow

/**
* CFG nodes preceeding a `ReturnStmt`
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
WARNING: module 'DataFlow' has been deprecated and may be removed in future (VariableLengthArraySizeNotInValidRange.ql:110,11-19)
WARNING: module 'TaintTracking' has been deprecated and may be removed in future (VariableLengthArraySizeNotInValidRange.ql:93,5-18)
| test.c:14:8:14:8 | VLA declaration | Variable-length array dimension size may be in an invalid range. |
| test.c:15:8:15:8 | VLA declaration | Variable-length array dimension size may be in an invalid range. |
| test.c:16:8:16:8 | VLA declaration | Variable-length array dimension size may be in an invalid range. |
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,2 @@
WARNING: module 'DataFlow' has been deprecated and may be removed in future (AppropriateStorageDurationsFunctionReturn.ql:33,20-28)
WARNING: module 'DataFlow' has been deprecated and may be removed in future (AppropriateStorageDurationsFunctionReturn.ql:37,31-39)
WARNING: module 'DataFlow' has been deprecated and may be removed in future (AppropriateStorageDurationsFunctionReturn.ql:50,6-14)
WARNING: module 'DataFlow' has been deprecated and may be removed in future (AppropriateStorageDurationsFunctionReturn.ql:50,26-34)
WARNING: module 'DataFlow' has been deprecated and may be removed in future (AppropriateStorageDurationsFunctionReturn.ql:56,3-11)
| test.c:3:10:3:10 | a | $@ with automatic storage may be accessible outside of its lifetime. | test.c:3:10:3:10 | a | a |
| test.c:15:4:15:8 | param [inner post update] | $@ with automatic storage may be accessible outside of its lifetime. | test.c:15:12:15:13 | a2 | a2 |
| test.c:12:16:12:20 | *param | $@ with automatic storage may be accessible outside of its lifetime. | test.c:15:12:15:13 | a2 | a2 |
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
WARNING: module 'DataFlow' has been deprecated and may be removed in future (DoNotRelyOnIndeterminateValuesOfErrno.ql:56,7-15)
WARNING: module 'DataFlow' has been deprecated and may be removed in future (DoNotRelyOnIndeterminateValuesOfErrno.ql:56,27-35)
WARNING: module 'DataFlow' has been deprecated and may be removed in future (DoNotRelyOnIndeterminateValuesOfErrno.ql:57,9-17)
WARNING: module 'DataFlow' has been deprecated and may be removed in future (DoNotRelyOnIndeterminateValuesOfErrno.ql:60,9-17)
| test.c:12:5:12:10 | call to perror | `errno` has indeterminate value after this $@. | test.c:10:21:10:26 | call to signal | call to signal |
| test.c:30:5:30:10 | call to perror | `errno` has indeterminate value after this $@. | test.c:26:21:26:26 | call to signal | call to signal |
| test.c:49:5:49:10 | call to perror | `errno` has indeterminate value after this $@. | test.c:45:21:45:26 | call to signal | call to signal |
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
WARNING: module 'DataFlow' has been deprecated and may be removed in future (DetectAndHandleStandardLibraryErrors.ql:459,5-13)
| test.c:18:3:18:11 | call to setlocale | Missing error detection for the call to function `setlocale`. |
| test.c:24:23:24:31 | call to setlocale | Missing error detection for the call to function `setlocale`. |
| test.c:29:22:29:27 | call to calloc | Missing error detection for the call to function `calloc`. |
Expand Down
Original file line number Diff line number Diff line change
@@ -1,28 +1,40 @@
WARNING: module 'DataFlow' has been deprecated and may be removed in future (DoNotCallFunctionPointerWithIncompatibleType.ql:45,54-62)
WARNING: module 'DataFlow' has been deprecated and may be removed in future (DoNotCallFunctionPointerWithIncompatibleType.ql:46,22-30)
WARNING: module 'DataFlow' has been deprecated and may be removed in future (DoNotCallFunctionPointerWithIncompatibleType.ql:50,20-28)
WARNING: module 'DataFlow' has been deprecated and may be removed in future (DoNotCallFunctionPointerWithIncompatibleType.ql:55,43-51)
edges
| test.c:48:68:48:70 | fns [f1] | test.c:49:3:49:5 | fns [f1] | provenance | |
| test.c:49:3:49:5 | fns [f1] | test.c:49:8:49:9 | f1 | provenance | |
| test.c:61:28:61:29 | f2 | test.c:62:3:62:11 | v1_called | provenance | |
| test.c:73:3:73:5 | fns [post update] [f1] | test.c:75:45:75:48 | & ... [f1] | provenance | |
| test.c:73:3:73:13 | ... = ... | test.c:73:3:73:5 | fns [post update] [f1] | provenance | |
| test.c:48:68:48:70 | *fns [f1] | test.c:49:3:49:5 | *fns [f1] | provenance | |
| test.c:48:68:48:70 | *fns [f2] | test.c:50:3:50:5 | *fns [f2] | provenance | |
| test.c:49:3:49:5 | *fns [f1] | test.c:49:8:49:9 | f1 | provenance | |
| test.c:50:3:50:5 | *fns [f2] | test.c:50:8:50:9 | f2 | provenance | |
| test.c:61:3:61:29 | ... = ... | test.c:62:3:62:11 | v1_called | provenance | |
| test.c:61:15:61:29 | f2 | test.c:61:3:61:29 | ... = ... | provenance | |
| test.c:73:3:73:5 | *fns [post update] [f1] | test.c:74:3:74:5 | *fns [f1] | provenance | |
| test.c:73:3:73:13 | ... = ... | test.c:73:3:73:5 | *fns [post update] [f1] | provenance | |
| test.c:73:12:73:13 | v2 | test.c:73:3:73:13 | ... = ... | provenance | |
| test.c:75:45:75:48 | & ... [f1] | test.c:48:68:48:70 | fns [f1] | provenance | |
| test.c:73:12:73:13 | v2 | test.c:74:3:74:13 | ... = ... | provenance | |
| test.c:74:3:74:5 | *fns [f1] | test.c:75:45:75:48 | *& ... [f1] | provenance | |
| test.c:74:3:74:5 | *fns [post update] [f2] | test.c:75:45:75:48 | *& ... [f2] | provenance | |
| test.c:74:3:74:13 | ... = ... | test.c:74:3:74:5 | *fns [post update] [f2] | provenance | |
| test.c:75:45:75:48 | *& ... [f1] | test.c:48:68:48:70 | *fns [f1] | provenance | |
| test.c:75:45:75:48 | *& ... [f2] | test.c:48:68:48:70 | *fns [f2] | provenance | |
nodes
| test.c:48:68:48:70 | fns [f1] | semmle.label | fns [f1] |
| test.c:49:3:49:5 | fns [f1] | semmle.label | fns [f1] |
| test.c:48:68:48:70 | *fns [f1] | semmle.label | *fns [f1] |
| test.c:48:68:48:70 | *fns [f2] | semmle.label | *fns [f2] |
| test.c:49:3:49:5 | *fns [f1] | semmle.label | *fns [f1] |
| test.c:49:8:49:9 | f1 | semmle.label | f1 |
| test.c:61:28:61:29 | f2 | semmle.label | f2 |
| test.c:50:3:50:5 | *fns [f2] | semmle.label | *fns [f2] |
| test.c:50:8:50:9 | f2 | semmle.label | f2 |
| test.c:61:3:61:29 | ... = ... | semmle.label | ... = ... |
| test.c:61:15:61:29 | f2 | semmle.label | f2 |
| test.c:62:3:62:11 | v1_called | semmle.label | v1_called |
| test.c:70:9:70:17 | v3_called | semmle.label | v3_called |
| test.c:73:3:73:5 | fns [post update] [f1] | semmle.label | fns [post update] [f1] |
| test.c:70:4:70:17 | v3_called | semmle.label | v3_called |
| test.c:73:3:73:5 | *fns [post update] [f1] | semmle.label | *fns [post update] [f1] |
| test.c:73:3:73:13 | ... = ... | semmle.label | ... = ... |
| test.c:73:12:73:13 | v2 | semmle.label | v2 |
| test.c:75:45:75:48 | & ... [f1] | semmle.label | & ... [f1] |
| test.c:74:3:74:5 | *fns [f1] | semmle.label | *fns [f1] |
| test.c:74:3:74:5 | *fns [post update] [f2] | semmle.label | *fns [post update] [f2] |
| test.c:74:3:74:13 | ... = ... | semmle.label | ... = ... |
| test.c:75:45:75:48 | *& ... [f1] | semmle.label | *& ... [f1] |
| test.c:75:45:75:48 | *& ... [f2] | semmle.label | *& ... [f2] |
subpaths
#select
| test.c:61:28:61:29 | f2 | test.c:61:28:61:29 | f2 | test.c:62:3:62:11 | v1_called | Incompatible function $@ assigned to function pointer is eventually called through the pointer. | test.c:41:13:41:14 | f2 | f2 |
| test.c:70:9:70:17 | v3_called | test.c:70:9:70:17 | v3_called | test.c:70:9:70:17 | v3_called | Incompatible function $@ assigned to function pointer is eventually called through the pointer. | test.c:58:7:58:15 | v3_called | v3_called |
| test.c:61:15:61:29 | f2 | test.c:61:15:61:29 | f2 | test.c:62:3:62:11 | v1_called | Incompatible function $@ assigned to function pointer is eventually called through the pointer. | test.c:41:13:41:14 | f2 | f2 |
| test.c:70:4:70:17 | v3_called | test.c:70:4:70:17 | v3_called | test.c:70:4:70:17 | v3_called | Incompatible function $@ assigned to function pointer is eventually called through the pointer. | test.c:58:7:58:15 | v3_called | v3_called |
| test.c:73:12:73:13 | v2 | test.c:73:12:73:13 | v2 | test.c:49:8:49:9 | f1 | Incompatible function $@ assigned to function pointer is eventually called through the pointer. | test.c:56:7:56:8 | v2 | v2 |
45 changes: 26 additions & 19 deletions c/cert/test/rules/EXP40-C/DoNotModifyConstantObjects.expected
Original file line number Diff line number Diff line change
@@ -1,33 +1,40 @@
WARNING: module 'DataFlow' has been deprecated and may be removed in future (DoNotModifyConstantObjects.ql:40,30-38)
WARNING: module 'DataFlow' has been deprecated and may be removed in future (DoNotModifyConstantObjects.ql:41,22-30)
WARNING: module 'DataFlow' has been deprecated and may be removed in future (DoNotModifyConstantObjects.ql:47,20-28)
WARNING: module 'DataFlow' has been deprecated and may be removed in future (DoNotModifyConstantObjects.ql:52,19-27)
edges
| test.c:5:8:5:9 | & ... | test.c:6:4:6:5 | aa | provenance | |
| test.c:26:15:26:15 | a | test.c:27:4:27:4 | a | provenance | |
| test.c:5:3:5:9 | ... = ... | test.c:6:3:6:5 | * ... | provenance | |
| test.c:5:8:5:9 | & ... | test.c:5:3:5:9 | ... = ... | provenance | |
| test.c:26:15:26:15 | a | test.c:27:3:27:4 | * ... | provenance | |
| test.c:34:13:34:14 | & ... | test.c:34:13:34:14 | & ... | provenance | |
| test.c:34:13:34:14 | & ... | test.c:37:3:37:10 | ... = ... | provenance | |
| test.c:34:13:34:14 | & ... | test.c:39:7:39:8 | p1 | provenance | |
| test.c:37:3:37:10 | ... = ... | test.c:40:7:40:9 | * ... | provenance | |
| test.c:39:7:39:8 | p1 | test.c:26:15:26:15 | a | provenance | |
| test.c:40:7:40:9 | * ... | test.c:26:15:26:15 | a | provenance | |
| test.c:59:7:59:8 | & ... | test.c:60:4:60:4 | p | provenance | |
| test.c:79:11:79:16 | call to strchr | test.c:81:6:81:12 | ... ++ | provenance | |
| test.c:59:3:59:8 | ... = ... | test.c:60:3:60:4 | * ... | provenance | |
| test.c:59:7:59:8 | & ... | test.c:59:3:59:8 | ... = ... | provenance | |
| test.c:79:3:79:31 | ... = ... | test.c:81:5:81:12 | * ... | provenance | |
| test.c:79:11:79:16 | call to strchr | test.c:79:3:79:31 | ... = ... | provenance | |
nodes
| test.c:5:3:5:9 | ... = ... | semmle.label | ... = ... |
| test.c:5:8:5:9 | & ... | semmle.label | & ... |
| test.c:6:4:6:5 | aa | semmle.label | aa |
| test.c:6:3:6:5 | * ... | semmle.label | * ... |
| test.c:26:15:26:15 | a | semmle.label | a |
| test.c:27:4:27:4 | a | semmle.label | a |
| test.c:27:3:27:4 | * ... | semmle.label | * ... |
| test.c:34:13:34:14 | & ... | semmle.label | & ... |
| test.c:34:13:34:14 | & ... | semmle.label | & ... |
| test.c:37:3:37:10 | ... = ... | semmle.label | ... = ... |
| test.c:39:7:39:8 | p1 | semmle.label | p1 |
| test.c:40:7:40:9 | * ... | semmle.label | * ... |
| test.c:59:3:59:8 | ... = ... | semmle.label | ... = ... |
| test.c:59:7:59:8 | & ... | semmle.label | & ... |
| test.c:60:4:60:4 | p | semmle.label | p |
| test.c:74:12:74:12 | s | semmle.label | s |
| test.c:60:3:60:4 | * ... | semmle.label | * ... |
| test.c:74:3:74:12 | * ... | semmle.label | * ... |
| test.c:79:3:79:31 | ... = ... | semmle.label | ... = ... |
| test.c:79:11:79:16 | call to strchr | semmle.label | call to strchr |
| test.c:81:6:81:12 | ... ++ | semmle.label | ... ++ |
| test.c:81:5:81:12 | * ... | semmle.label | * ... |
subpaths
#select
| test.c:6:4:6:5 | aa | test.c:5:8:5:9 | & ... | test.c:6:4:6:5 | aa | Const variable assigned with non const-value. |
| test.c:27:4:27:4 | a | test.c:34:13:34:14 | & ... | test.c:27:4:27:4 | a | Const variable assigned with non const-value. |
| test.c:27:4:27:4 | a | test.c:40:7:40:9 | * ... | test.c:27:4:27:4 | a | Const variable assigned with non const-value. |
| test.c:60:4:60:4 | p | test.c:59:7:59:8 | & ... | test.c:60:4:60:4 | p | Const variable assigned with non const-value. |
| test.c:74:12:74:12 | s | test.c:74:12:74:12 | s | test.c:74:12:74:12 | s | Const variable assigned with non const-value. |
| test.c:81:6:81:12 | ... ++ | test.c:79:11:79:16 | call to strchr | test.c:81:6:81:12 | ... ++ | Const variable assigned with non const-value. |
| test.c:6:3:6:5 | * ... | test.c:5:8:5:9 | & ... | test.c:6:3:6:5 | * ... | Const variable assigned with non const-value. |
| test.c:27:3:27:4 | * ... | test.c:34:13:34:14 | & ... | test.c:27:3:27:4 | * ... | Const variable assigned with non const-value. |
| test.c:27:3:27:4 | * ... | test.c:40:7:40:9 | * ... | test.c:27:3:27:4 | * ... | Const variable assigned with non const-value. |
| test.c:60:3:60:4 | * ... | test.c:59:7:59:8 | & ... | test.c:60:3:60:4 | * ... | Const variable assigned with non const-value. |
| test.c:74:3:74:12 | * ... | test.c:74:3:74:12 | * ... | test.c:74:3:74:12 | * ... | Const variable assigned with non const-value. |
| test.c:81:5:81:12 | * ... | test.c:79:11:79:16 | call to strchr | test.c:81:5:81:12 | * ... | Const variable assigned with non const-value. |
Original file line number Diff line number Diff line change
@@ -1,7 +1,2 @@
WARNING: module 'DataFlow' has been deprecated and may be removed in future (OnlyUseValuesForFsetposThatAreReturnedFromFgetpos.ql:30,32-40)
WARNING: module 'DataFlow' has been deprecated and may be removed in future (OnlyUseValuesForFsetposThatAreReturnedFromFgetpos.ql:31,22-30)
WARNING: module 'DataFlow' has been deprecated and may be removed in future (OnlyUseValuesForFsetposThatAreReturnedFromFgetpos.ql:33,14-22)
WARNING: module 'DataFlow' has been deprecated and may be removed in future (OnlyUseValuesForFsetposThatAreReturnedFromFgetpos.ql:36,20-28)
WARNING: module 'DataFlow' has been deprecated and may be removed in future (OnlyUseValuesForFsetposThatAreReturnedFromFgetpos.ql:42,21-29)
| test.c:7:24:7:30 | & ... | The position argument of a call to `fsetpos()` should be obtained from a call to `fgetpos()`. |
| test.c:33:24:33:30 | & ... | The position argument of a call to `fsetpos()` should be obtained from a call to `fgetpos()`. |
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
WARNING: module 'TaintTracking' has been deprecated and may be removed in future (InsufficientMemoryAllocatedForObject.ql:90,5-18)
WARNING: module 'TaintTracking' has been deprecated and may be removed in future (InsufficientMemoryAllocatedForObject.ql:148,5-18)
| test.c:12:19:12:24 | call to malloc | Allocation size (32 bytes) is not a multiple of the size of 'S1' (36 bytes). | test.c:12:26:12:32 | 32 | |
| test.c:15:19:15:24 | call to malloc | Allocation size calculated from the size of a different type ($@). | test.c:15:26:15:35 | sizeof(<expr>) | sizeof(S1 *) |
| test.c:20:19:20:24 | call to malloc | Allocation size (128 bytes) is not a multiple of the size of 'S1' (36 bytes). | test.c:20:26:20:36 | ... * ... | |
Expand Down
Loading
Loading