Preprocessor: Prevent (and give an error on) expression division by 0.

This commit is contained in:
John Kessenich 2015-07-20 12:29:41 -06:00
parent e9022e1ffe
commit d2762564dc
3 changed files with 19 additions and 1 deletions

View File

@ -42,8 +42,12 @@ ERROR: 0:3006: '#undef' : predefined names can't be (un)defined: __LINE__
ERROR: 0:3007: '#undef' : predefined names can't be (un)defined: __FILE__
ERROR: 0:3008: '#undef' : predefined names can't be (un)defined: __VERSION__
ERROR: 0:3009: '#undef' : names beginning with "GL_" can't be (un)defined: GL_SOME_EXTENSION
ERROR: 0:4000: 'preprocessor evaluation' : division by 0
ERROR: 0:0: 'preprocessor evaluation' : division by 0
ERROR: 0:3: 'preprocessor evaluation' : bad expression
ERROR: 0:3: 'preprocessor evaluation' : division by 0
ERROR: 0:10001: '' : missing #endif
ERROR: 44 compilation errors. No code generated.
ERROR: 48 compilation errors. No code generated.
Shader version: 300

View File

@ -171,6 +171,13 @@ float c = foobar(1.1, 2.2
#undef __VERSION__
#undef GL_SOME_EXTENSION
#line 4000
#line 200 % 0 // ERROR, div by 0
#if __LINE__ / 0 // ERROR, div by 0
#endif
#if 7% // ERROR incomplete expression
#line 10000
#if 0
// ERROR, EOF

View File

@ -505,6 +505,13 @@ int TPpContext::eval(int token, int precedence, bool shortCircuit, int& res, boo
token = scanToken(ppToken);
token = eval(token, binop[op].precedence, shortCircuit, res, err, ppToken);
if (binop[op].op == op_div || binop[op].op == op_mod) {
if (res == 0) {
parseContext.ppError(loc, "division by 0", "preprocessor evaluation", "");
res = 1;
}
}
res = binop[op].op(leftSide, res);
}