The analyzer has detected a faulty or suboptimal loop. A standard pattern is used where some operation is executed for every pair of elements of an array. This operation, however, is usually not required for a pair whose members are the same element, i.e. when 'i == j'.
For example:
for (int i = 0; i < size; i++) for (int j = i; j < size; j++) ...
It is highly possible that a more correct and effective way to traverse the arrays would probably be this:
for (int i = 0; i < size; i++) for (int j = i + 1; j < size; j++) ...
The next example is taken from a real application; the authors implemented their own algorithm to sort devices by priority but it is non-optimal:
/* Simple bubble sort */ for (i = 0; i < n_devices; ++i) { for (uint32_t j = i; j < n_devices; ++j) { if (devices[i]->prio > devices[j]->prio) { struct device_t *tmp; tmp = devices[i]; devices[i] = devices[j]; devices[j] = tmp; } } }
Fixed code:
/* Simple bubble sort */ for (i = 0; i < n_devices - 1; ++i) { for (uint32_t j = i + 1; j < n_devices; ++j) { if (devices[i]->prio > devices[j]->prio) { struct device_t *tmp; tmp = devices[i]; devices[i] = devices[j]; devices[j] = tmp; } } }
This diagnostic is classified as:
You can look at examples of errors detected by the V791 diagnostic. |