]> granicus.if.org Git - clang/commitdiff
[analyzer] Fix taint propagation in GenericTaintChecker
authorKristof Umann <dkszelethus@gmail.com>
Tue, 5 Mar 2019 12:42:59 +0000 (12:42 +0000)
committerKristof Umann <dkszelethus@gmail.com>
Tue, 5 Mar 2019 12:42:59 +0000 (12:42 +0000)
The gets function has no SrcArgs. Because the default value for isTainted was
false, it didn't mark its DstArgs as tainted.

Patch by Gábor Borsik!

Differential Revision: https://reviews.llvm.org/D58828

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@355396 91177308-0d34-0410-b5e6-96231b3b80d8

lib/StaticAnalyzer/Checkers/GenericTaintChecker.cpp
test/Analysis/taint-generic.c

index c50fe49cbd3c444d73b974f681e808803faa9f54..eeddfddc4d40777a6dcedb4bf5537056bb4a4cbf 100644 (file)
@@ -458,7 +458,7 @@ GenericTaintChecker::TaintPropagationRule::process(const CallExpr *CE,
   ProgramStateRef State = C.getState();
 
   // Check for taint in arguments.
-  bool IsTainted = false;
+  bool IsTainted = true;
   for (unsigned ArgNum : SrcArgs) {
     if (ArgNum >= CE->getNumArgs())
       return State;
index 30529503e5ade1ccded2ca24884810d900cbcc1c..42e390dddef2f5b73a9b9986e7dd14a8deae798b 100644 (file)
@@ -2,6 +2,7 @@
 // RUN: %clang_analyze_cc1  -DFILE_IS_STRUCT -analyzer-checker=alpha.security.taint,core,alpha.security.ArrayBoundV2 -Wno-format-security -verify %s
 
 int scanf(const char *restrict format, ...);
+char *gets(char *str);
 int getchar(void);
 
 typedef struct _FILE FILE;
@@ -142,6 +143,12 @@ void testTaintSystemCall3() {
   system(buffern2); // expected-warning {{Untrusted data is passed to a system call}}
 }
 
+void testGets() {
+  char str[50];
+  gets(str);
+  system(str); // expected-warning {{Untrusted data is passed to a system call}}
+}
+
 void testTaintedBufferSize() {
   size_t ts;
   scanf("%zd", &ts);