Closed khlevin closed 1 year ago
This is how we do it in CWhy: https://github.com/plasma-umass/cwhy/blob/fb99b7a07eea88a857281d0fb04997622ad1cf44/src/cwhy/cwhy.py#L13-L57
ChatDBG uses the same code, modulo single-quotes vs. double-quotes (https://github.com/plasma-umass/ChatDBG/blob/ad4624dea1deb5ae4549b8c149af2396c2d9d609/src/chatdbg/chatdbg_utils.py#L22-L65).
Pushed an updated version that correctly handles the above case.
The root cause of this error is that the variable x
is initialized
to 1.0, and then iteratively multiplied by i
in the for
loop in
the fact
function. However, the loop starts from i = 0.0
, which
means that x
will always be multiplied by 0 in the first iteration,
resulting in x
being 0.0. The subsequent assert
statement checks
if x
is not equal to 0.0, which will always fail.
To fix this error, we need to initialize x
to 1.0 instead of 0.0.
This can be done by changing the initialization of i
in the for
loop to start from 1.0 instead of 0.0.
Fixed source code:
/* frame 0 */ /* frame 1 */ /* frame 2 */ /*
frame 3 */ /* frame 4 */ #include <assert.h> #include <iostream>
float fact(float n) { auto x = 1.0; for (auto i = 1.0; i < n; i++)
{ x *= i; } assert(x != 0.0); ^-----------------------------
------------------------------------------------ /* frame 5 */ for
(auto i = 1.0; i < n; i++) { x *= i; } assert(x != 0.0);
return x; }
int main()
{
std::cout << fact(100) << std::endl;
^-----------------------------------------------------------------------------
With this fix, x
will correctly accumulate the product of i
values, starting from 1 instead of 0, and the assert
statement will
not fail.
Expected to be cleanly formatted, but is not.
With this fix,
x
will correctly accumulate the product ofi
values, starting from 1 instead of 0, and theassert
statement will not fail.