Is there a technic to avoid this bug

H

hg

Hi,

In C/C++ I got used to write an expression like so:

#define TEST 0

if (TEST == value)
{

}

in order to avoid the usual bug:
if (value = TEST)
{

}

In a relatively similar domain, I spent a few hours find this bug:

value == self.Get_Value()
if value == WHATEVER:
do this

instead of
value = self.Get_Value()
if value == WHATEVER:
do this

Is there a way to avoid such a bug with some type of construct ?

Thanks,
hg
 
D

Diez B. Roggisch

hg said:
Hi,

In C/C++ I got used to write an expression like so:

#define TEST 0

if (TEST == value)
{

}

in order to avoid the usual bug:
if (value = TEST)
{

}

In a relatively similar domain, I spent a few hours find this bug:

value == self.Get_Value()
if value == WHATEVER:
do this

instead of
value = self.Get_Value()
if value == WHATEVER:
do this

Is there a way to avoid such a bug with some type of construct ?

No. In a language inherent with sideeffects, there is nothing that should
force you to not write that.

However, it might be that either pychecker or pylint will give you a warning
for such statements.

Diez
 
M

Michele Simionato

However, it might be that either pychecker or pylint will give you a warning
for such statements.

Yep, pychecker gives a warning "Statement appears to have no effect"

Michele Simionato
 
J

John J. Lee

Diez B. Roggisch said:
hg wrote: [...]
In a relatively similar domain, I spent a few hours find this bug:

value == self.Get_Value()
if value == WHATEVER:
do this

instead of
value = self.Get_Value()
if value == WHATEVER:
do this

Is there a way to avoid such a bug with some type of construct ?

No. In a language inherent with sideeffects, there is nothing that should
force you to not write that.
[...]

It's illegal in C#:

// -------- compare.cs ----------
class BadComparison {
static void Main() {
1 == 2;
}
}
// -------- end -----------------

$ mcs compare.cs
compare.cs(3,9): error CS0201: Only assignment, call, increment, decrement, and new object expressions can be used as a statement
Compilation failed: 1 error(s), 0 warnings
csharp[0]$


// -------- compare2.cs ----------
class BadComparison {
static void Main() {
bool falsehood = 1 == 2;
}
}
// -------- end -----------------

$ mcs compare2.cs
compare2.cs(3,14): warning CS0219: The variable `falsehood' is assigned but its value is never used
Compilation succeeded - 1 warning(s)


John
 
B

Ben Finney

hg said:
I spent a few hours find this bug:

value == self.Get_Value()
if value == WHATEVER:
do this

instead of
value = self.Get_Value()
if value == WHATEVER:
do this

Is there a way to avoid such a bug with some type of construct ?

Use pylint to check your code for common mistakes.

<URL:http://www.logilab.org/projects/pylint>

===== bad_assign.py =====
""" Demonstrate a logical error """
value = None

value == 10
if value == 10:
print "Yep"
else:
print "Nope"
=====

$ python ./bad_assign.py
Nope

$ pylint ./bad_assign.py
************* Module bad_assign
C: 2: Invalid name "value" (should match (([A-Z_][A-Z1-9_]*)|(__.*__))$)
W: 4: Statement seems to have no effect

[...]
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,479
Members
44,900
Latest member
Nell636132

Latest Threads

Top