Files
2019-05-01 08:33:35 +02:00

186 lines
2.7 KiB
C++

void *__builtin_alloca(unsigned long sz);
#define alloca __builtin_alloca
void forOnce() {
for (struct { bool stop; } state = { 0 }; !state.stop; state.stop = 1) {
alloca(100); // GOOD
}
}
void forOnce2() {
bool stop;
for (stop = 0; !stop; stop = 1) {
alloca(100); // GOOD
}
}
void forTwice() {
for (int i = 0; i < 2; i++) {
alloca(100); // GOOD
}
}
void forEver() {
for (;;) {
alloca(100); // BAD
}
}
void doTwice() {
int i = 0;
do {
alloca(100); // GOOD
} while (++i < 2);
}
void unknownStartingPoint(int i) {
for (; i < 2; i++) {
alloca(100); // BAD
}
}
int getInt();
void atMostTwice() {
int i = 0;
while (!(i >= 2 || getInt())) {
i++;
alloca(100); // GOOD
}
}
void sometimesIncrement() {
int i = 0;
while (i < 2) {
alloca(100); // BAD
if (getInt()) {
i++;
}
}
}
void upAndDown() {
for (int i = 0; i < 2; i++) {
alloca(100); // BAD
if (getInt()) {
i--;
}
}
}
void largeBound() {
for (int i = 0; i < 10000; i++) {
alloca(100); // BAD
}
}
void largeOffset() {
int i;
if (getInt()) {
i = 9998;
} else {
i = 9997;
}
for (; i < 10000; i++) {
alloca(100); // GOOD
}
}
void maybeSmallOffset() {
int i;
if (getInt()) {
i = 0;
} else {
i = 9997;
}
for (; i < 10000; i++) {
alloca(100); // BAD
}
}
void incBefore() {
int i = -1;
i++; // not understood by data flow
for (; i < 2; i++) {
alloca(100); // GOOD [FALSE POSITIVE]
}
}
void nestedAddsUp() {
for (int i = 0; i < 16; i++) {
for (int j = 0; j < 16; j++) {
alloca(100); // BAD [NOT DETECTED]
}
}
}
void nestedWithReset() {
bool stop = 0;
for (int i = 0; i < 1; i++) {
stop = 0;
do {
stop = 1;
alloca(100); // GOOD
} while (!stop);
stop = 0;
}
}
void eqFalse() {
for (int stop = 0; stop == 0; stop = 5) {
alloca(100); // GOOD
}
}
void eqFalseFlipped() {
for (int stop = 0; stop == 0; stop = 0) {
alloca(100); // BAD
}
}
void neFalse() {
for (bool go_on = true; go_on != 0; go_on = false) {
alloca(100); // GOOD
}
}
void eqTrue() {
for (bool go_on = false; go_on == true; go_on = false) {
alloca(100); // GOOD
}
}
void countDownFor() {
for (int i = 2; i >= 0; i--) {
alloca(100); // GOOD
}
}
void countDownWhile() {
int i;
i = 2;
while (--i >= 0) {
alloca(100); // GOOD
}
}
void countDownAssignAdd() {
for (int i = 2; i >= 0; i = i - 1) {
alloca(100); // GOOD
}
}
void countDownWrong() {
for (int i = 2-1; i >= 0; i++) {
alloca(100); // BAD
}
}
void countUpFromUnsigned(unsigned long i) {
while (i < 10) {
i = i + 1;
alloca(100); // GOOD
}
}