llvm-project/clang/test/Analysis/null-deref-ps-region.c
Henry Wong afe62cdc4e [analyzer] Improve the modeling of memset().
Since there is no perfect way bind the non-zero value with the default binding, this patch only considers the case where buffer's offset is zero and the char value is 0. And according to the value for overwriting, decide how to update the string length.

Reviewers: dcoughlin, NoQ, xazax.hun, a.sidorin, george.karpenkov

Reviewed By: NoQ

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

llvm-svn: 332463
2018-05-16 12:37:53 +00:00

73 lines
1.6 KiB
C

// RUN: %clang_analyze_cc1 -analyzer-checker=core,alpha.core,unix,alpha.unix -std=gnu99 -analyzer-store=region -verify %s
#include "Inputs/system-header-simulator.h"
typedef __typeof(sizeof(int)) size_t;
void *memset(void *__s, int __c, size_t __n);
void *malloc(size_t __size);
void free(void *__ptr);
// The store for 'a[1]' should not be removed mistakenly. SymbolicRegions may
// also be live roots.
void f14(int *a) {
int i;
a[1] = 1;
i = a[1];
if (i != 1) {
int *p = 0;
i = *p; // no-warning
}
}
void foo() {
int *x = malloc(sizeof(int));
memset(x, 0, sizeof(int));
int n = 1 / *x; // expected-warning {{Division by zero}}
free(x);
}
void bar() {
int *x = malloc(sizeof(int));
memset(x, 0, 1);
int n = 1 / *x; // no-warning
free(x);
}
void testConcreteNull() {
int *x = 0;
memset(x, 0, 1); // expected-warning {{Null pointer argument in call to memory set function}}
}
void testStackArray() {
char buf[13];
memset(buf, 0, 1); // no-warning
}
void testHeapSymbol() {
char *buf = (char *)malloc(13);
memset(buf, 0, 1); // no-warning
free(buf);
}
void testStackArrayOutOfBound() {
char buf[1];
memset(buf, 0, 1024); // expected-warning {{Memory set function accesses out-of-bound array element}}
}
void testHeapSymbolOutOfBound() {
char *buf = (char *)malloc(1);
memset(buf, 0, 1024); // expected-warning {{Memory set function accesses out-of-bound array element}}
free(buf);
}
void testStackArraySameSize() {
char buf[1];
memset(buf, 0, sizeof(buf)); // no-warning
}
void testHeapSymbolSameSize() {
char *buf = (char *)malloc(1);
memset(buf, 0, 1); // no-warning
free(buf);
}