mc-imperial / dredd

Framework for evaluating C/C++ compiler testing tools
Apache License 2.0
11 stars 3 forks source link

Introduced lambda could cause programs to exceed clang++'s maximum bracket nesting level #288

Open JonathanFoo0523 opened 1 month ago

JonathanFoo0523 commented 1 month ago

Applying and compiling:

int main() {
    return
    1 ||
    2 ||
    3 ||
    4 ||
    5 ||
    6 ||
    7 ||
    8 ||
    9 ||
    10 ||
    11 ||
    12 ||
    13 ||
    14 ||
    15 ||
    16 ||
    17 ||
    18 ||
    19 ||
    20 ||
    21 ||
    22 ||
    23 ||
    24 ||
    25 ||
    26 ||
    27 ||
    28 ||
    29 ||
    30 ||
    31 ||
    32 ||
    33 ||
    34 ||
    35 ||
    36 ||
    37 ||
    38 ||
    39 ||
    40 ||
    41 ||
    42 ||
    43 ||
    44 ||
    45 ||
    46 ||
    47 ||
    48 ||
    49 ||
    50 ||
    51 ||
    52 ||
    53 ||
    54 ||
    55 ||
    56 ||
    57 ||
    58 ||
    59 ||
    60 ||
    61 ||
    62 ||
    63 ||
    64 ||
    65 ||
    66 ||
    67 ||
    68 ||
    69 ||
    70 ||
    71 ||
    72 ||
    73 ||
    74 ||
    75 ||
    76 ||
    77 ||
    78 ||
    79 ||
    80 ||
    81 ||
    82 ||
    83 ||
    84 ||
    85 ||
    86 ||
    87 ||
    88 ||
    89 ||
    90 ||
    91 ||
    92 ||
    93 ||
    94 ||
    95 ||
    96 ||
    97 ||
    98 ||
    99 ||
    100 ||
    101 ||
    102 ||
    103 ||
    104 ||
    105 ||
    106 ||
    107 ||
    108 ||
    109 ||
    110 ||
    111 ||
    112 ||
    113 ||
    114 ||
    115 ||
    116 ||
    117 ||
    118 ||
    119 ||
    120 ||
    121 ||
    122 ||
    123 ||
    124 ||
    125 ||
    126 ||
    127 ||
    128 ||
    129;
}

results in compilation error

fatal error: bracket nesting level exceeded maximum of 256
note: use -fbracket-depth=N to increase maximum nesting level
afd commented 1 month ago

Does this come up in practice? I don't think there is anything we can do about it, but perhaps we could add a "Troubleshooting" section to the Dredd README where scalability issues like this are discussed, explaining that in some cases one may need to either:

Aside: Dredd always uses a lambda for the second argument of a short-circuit operator, in case it would have undefined behaviour. There could be a heuristic to avoid this in the case of expressions that evidently can have no undefined behaviour, but that is tricky; e.g. even a simple "x == y" comparison could have UB if either x or y is not initialized.