Skip to content

Commit bb56622

Browse files
committed
answering comments to make code more correct
Signed-off-by: Helge Wehder <[email protected]>
1 parent 7cafd08 commit bb56622

File tree

3 files changed

+86
-43
lines changed

3 files changed

+86
-43
lines changed

docs/Secure-Coding-Guide-for-Python/CWE-691/CWE-783/README.md

Lines changed: 51 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -50,46 +50,67 @@ If a method changes an object’s state (has side effects) and is called multipl
5050

5151
## Non-Compliant Code Example
5252

53-
This `noncompliant01.py` code is expected to provide labels for numbers obfuscates the evaluation and logic.
53+
`noncompliant01.py` is expected to provide labels for numbers, but it unnecessarily obfuscates the evaluation and logic.
5454

5555
_[noncompliant01.py](noncompliant01.py):_
5656

5757
```python
5858
"""Non-Compliant Code Example"""
5959

6060

61-
def label(number: int) -> str:
62-
a = int(number < 0) # negative flag
63-
b = (number & 1) ^ 1 # even flag (1 for even, 0 for odd)
64-
c = int(number < 5) # small flag
65-
66-
key = (a << 2) | (b << 1) | c # pack flags into a single key
67-
68-
parts = ("big", "small", "even", "even", "neg", "neg", "neg", "neg")
61+
def label(number: int) -> list[str]:
62+
key = int(number < 5) # (1) small
63+
key |= ((number & 1) ^ 1) << 1 # (2) for even, 0 for odd
64+
key |= (number < 0) << 2 # (4) negative
65+
key |= (number > 0) << 3 # (8) positive
66+
67+
parts = (
68+
"big", # 0
69+
"small", # 1
70+
"even small", # 2
71+
"even small", # 3
72+
"neg", # 4
73+
"neg small", # 5
74+
"neg even small", # 6
75+
"neg even small", # 7
76+
"big", # 8
77+
"big even", # 9
78+
"neg big", # 10
79+
"neg big even", # 11
80+
"big", # 12
81+
"big even", # 13
82+
"neg big", # 14
83+
"neg big even", # 15
84+
)
6985

7086
permuted = tuple(parts[(i * 5) & 7] for i in range(8))
7187

7288
idx = (key * 5) & 7
73-
return permuted[idx]
89+
return permuted[idx].split(" ")
7490

7591

76-
for number in range(-3, 3):
92+
for number in range(-6, 6):
7793
print(f"{number} = {label(number)}")
78-
7994
```
8095

8196
_Example output of `noncompliant01.py`:_
8297

8398
```bash
84-
-3 = neg
85-
-2 = neg
86-
-1 = neg
87-
0 = even
88-
1 = small
89-
2 = even
99+
-6 = ['neg', 'even', 'small']
100+
-5 = ['neg', 'small']
101+
-4 = ['neg', 'even', 'small']
102+
-3 = ['neg', 'small']
103+
-2 = ['neg', 'even', 'small']
104+
-1 = ['neg', 'small']
105+
0 = ['even', 'small']
106+
1 = ['small']
107+
2 = ['even', 'small']
108+
3 = ['small']
109+
4 = ['even', 'small']
110+
5 = ['big']
90111
```
91112

92-
Attempting to add a label for `zero` will be challenging.
113+
The `noncompliant01.py` does respond with the correct output. Extending the `noncompliant01.py` to also a label `postive` or `zero` numbers would be challenging.
93114

94115
## Compliant Solution
95116

@@ -101,17 +122,20 @@ _[compliant01.py](compliant01.py):_
101122
"""Compliant Code Example"""
102123

103124

104-
def label(number: int):
125+
def label(number: int) -> list[str]:
126+
labels = []
105127
if number < 0:
106-
return "neg"
128+
labels.append("neg")
107129
if number % 2 == 0:
108-
return "even"
130+
labels.append("even")
109131
if number < 5:
110-
return "small"
111-
return "big"
132+
labels.append("small")
133+
if number >= 5:
134+
labels.append("big")
135+
return labels
112136

113137

114-
for number in range(-3, 3):
138+
for number in range(-6, 6):
115139
print(f"{number} = {label(number)}")
116140

117141
```
@@ -167,10 +191,10 @@ for number in range(-3, 3):
167191
</tr>
168192
<tr>
169193
<td>[python power 2025]</td>
170-
<td>7.2.1. Augmented assignment statements [online]. Available from: <a href="https://docs.python.org/3/reference/simple_stmts.html?highlight=augmented%20assignment%20operators#augmented-assignment-statements">https://docs.python.org/3/reference/simple_stmts.html?highlight=augmented%20assignment%20operators#augmented-assignment-statement</a>, [Accessed 19 September 2025]</td>
194+
<td>6. Expressions [online]. Available from: <a href="https://docs.python.org/3/reference/expressions.html#index-59">https://docs.python.org/3/reference/expressions.html#index-59</a>, [Accessed 19 September 2025]</td>
171195
</tr>
172196
<tr>
173197
<td>[PLR 2022]</td>
174-
<td>6.16. Evaluation order [online]. Available from: <a href="https://docs.python.org/3/reference/expressions.html#evaluation-orde">https://docs.python.org/3/reference/expressions.html#evaluation-orde</a>, [Accessed 19 September 2025]</td>
198+
<td>6.16. Evaluation order [online]. Available from: <a href="https://docs.python.org/3/reference/expressions.html#evaluation-order">https://docs.python.org/3/reference/expressions.html#evaluation-order</a>, [Accessed 19 September 2025]</td>
175199
</tr>
176200
</table>

docs/Secure-Coding-Guide-for-Python/CWE-691/CWE-783/compliant01.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,18 @@
33
"""Compliant Code Example"""
44

55

6-
def label(number: int):
6+
def label(number: int) -> list[str]:
7+
labels = []
78
if number < 0:
8-
return "neg"
9+
labels.append("neg")
910
if number % 2 == 0:
10-
return "even"
11+
labels.append("even")
1112
if number < 5:
12-
return "small"
13-
return "big"
13+
labels.append("small")
14+
if number >= 5:
15+
labels.append("big")
16+
return labels
1417

1518

16-
for number in range(-3, 3):
19+
for number in range(-6, 6):
1720
print(f"{number} = {label(number)}")

docs/Secure-Coding-Guide-for-Python/CWE-691/CWE-783/noncompliant01.py

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,36 @@
33
"""Non-Compliant Code Example"""
44

55

6-
def label(number: int) -> str:
7-
a = int(number < 0) # negative flag
8-
b = (number & 1) ^ 1 # even flag (1 for even, 0 for odd)
9-
c = int(number < 5) # small flag
10-
11-
key = (a << 2) | (b << 1) | c # pack flags into a single key
12-
13-
parts = ("big", "small", "even", "even", "neg", "neg", "neg", "neg")
6+
def label(number: int) -> list[str]:
7+
key = int(number < 5) # (1) small
8+
key |= ((number & 1) ^ 1) << 1 # (2) for even, 0 for odd
9+
key |= (number < 0) << 2 # (4) negative
10+
key |= (number > 0) << 3 # (8) positive
11+
12+
parts = (
13+
"big", # 0
14+
"small", # 1
15+
"even small", # 2
16+
"even small", # 3
17+
"neg", # 4
18+
"neg small", # 5
19+
"neg even small", # 6
20+
"neg even small", # 7
21+
"big", # 8
22+
"big even", # 9
23+
"neg big", # 10
24+
"neg big even", # 11
25+
"big", # 12
26+
"big even", # 13
27+
"neg big", # 14
28+
"neg big even", # 15
29+
)
1430

1531
permuted = tuple(parts[(i * 5) & 7] for i in range(8))
1632

1733
idx = (key * 5) & 7
18-
return permuted[idx]
34+
return permuted[idx].split(" ")
1935

2036

21-
for number in range(-3, 3):
37+
for number in range(-6, 6):
2238
print(f"{number} = {label(number)}")

0 commit comments

Comments
 (0)