We can achieve complete statement coverage but still miss bugs because:
-
The failure occurs only if you reach a statement taking the TRUE branch of an IF statement, and you got to the statement with a test that passed through the FALSE branch.
-
The failure depends on the program's inability to handle specific data values, rather than on the program's flow of control.
-
Both A and B
-
We are not required to test code that customers are unlikely to execute.
Statement coverage only guarantees that every line of code executes at least once, but this has critical limitations. Option A describes control-flow dependencies: a bug might only appear when taking one branch of a conditional, but your test might only exercise another branch. Option B describes data-flow problems: certain bugs depend on specific input values that trigger edge cases, regardless of code path. Both scenarios mean 100% statement coverage can still miss serious defects.
Complete statement coverage only guarantees every line of code has been executed at least once — it says nothing about whether every branch/condition combination was tested (option A) or whether the program was tested against the range of specific data values that could trigger a defect (option B). Since both of these gaps are real limitations of statement coverage, 'Both A and B' is correct.