Для приведенного ниже фрагмента кода:
int *p = (int *)malloc(10);
int *q = (int *)malloc(10);
ptrdiff_t x = q - p;
printf("Hello World %td", x);
Я понимаю, почему компилятор не может выдать ошибку для вычитания указателя, поскольку операция не определена, а не недопустима .
Однако я не понимаю, почему я не предупреждаю о ситуации.Я пробовал VS2017, GCC 7.1.1 и Clang пока безрезультатно.
Вещи, которые я уже прошел
Что именно является указателем Cесли не адрес памяти? .
From, этот ответ и процитированный пункт 6.5.6 N1570 вполнеЯсно, что простое вычитание двух указателей не дает никакого значимого результата.
Для указателей на элементы массива the result is the difference of the subscripts of the two array elements
@ N1570 имеет смыслпоэтому я не оспариваю законность вычитания .
Я вполне уверен, что компилятор понимает, что p
и q
не являются указателями на элементы массива и может легко предупредитьничего не подозревающий пользователь о проблеме.Почему они этого не делают?
Даже если они этого не делают, есть ли опция флаг / компилятор для VS, gcc или clang, которая может перехватить этот потенциальный источник ошибки?
Ни один не делает gcc -Wall -Wextra
, ни /Wall
в VS обнаруживают это.