История изменений
Исправление MOPKOBKA, (текущая версия) :
На самом деле идея крайне проста, вот C Safe Ptr v 0.0.0.0.1
#include <stdio.h>
#include <stdlib.h>
#define SAFE_PTR(TYPE) struct{TYPE p;}
#define SAFE_PTR_SET(NAME, V) NAME.p = V;
#define SAFE_PTR_CHECK(NAME) (NAME.p != NULL)
#define SAFE_PTR_GET(NAME) ({ \
if (!NAME.p) abort(); \
NAME.p; \
})
int main() {
SAFE_PTR(const char*) ptr;
SAFE_PTR_SET(ptr, "hello world");
// ошибка компиляции
// const char *s2 = ptr;
if (SAFE_PTR_CHECK(ptr)) {
puts(SAFE_PTR_GET(ptr));
}
SAFE_PTR_SET(ptr, NULL);
const char *s = SAFE_PTR_GET(ptr); // abort
printf("%s\n", s ? s : "null");
return 0;
}
Сюда добавить можно NOT_NULL_SAFE_PTR, в сеттере задать ему через правила gcc не принимать выведенные компилятором NULL значения, и допускать только другие NOT_NULL_SAFE_PTR и сделать NOT_NULL_SAFE_PTR_FROM(OBJ) &OBJ
Вместо поля p сделать какой нибудь DONT_USE_INTERNAL_SAFE_PTR_FIELD и поставить хук на удаление из списка разработчиков при нахождении этой строки в коммите.
Исправление MOPKOBKA, :
На самом деле идея крайне проста, вот C Safe Ptr v 0.0.0.0.1
#include <stdio.h>
#include <stdlib.h>
#define SAFE_PTR(TYPE) struct{TYPE p;}
#define SAFE_PTR_SET(NAME, V) NAME.p = V;
#define SAFE_PTR_CHECK(NAME) (NAME.p != NULL)
#define SAFE_PTR_GET(NAME) ({ \
if (!NAME.p) abort(); \
NAME.p; \
})
int main() {
SAFE_PTR(const char*) ptr;
SAFE_PTR_SET(ptr, "hello world");
// ошибка компиляции
// const char *s2 = ptr;
if (SAFE_PTR_CHECK(ptr)) {
puts(SAFE_PTR_GET(ptr));
}
SAFE_PTR_SET(ptr, NULL);
const char *s = SAFE_PTR_GET(ptr); // abort
printf("%s\n", s ? s : "null");
return 0;
}
Сюда добавить можно NOT_NULL_SAFE_PTR, в сеттере задать ему через правила gcc не принимать выведенные компилятором NULL значения, и допускать только другие NOT_NULL_SAFE_PTR и сделать NOT_NULL_SAFE_PTR_FROM(OBJ) &OBJ
Исправление MOPKOBKA, :
На самом деле идея крайне проста, вот C Safe Ptr v 0.0.0.0.1
#include <stdio.h>
#include <stdlib.h>
#define SAFE_PTR(TYPE) struct{TYPE p;}
#define SAFE_PTR_SET(NAME, V) NAME.p = V;
#define SAFE_PTR_CHECK(NAME) (NAME.p != NULL)
#define SAFE_PTR_GET(NAME) ({ \
if (!NAME.p) abort(); \
NAME.p; \
})
int main() {
SAFE_PTR(const char*) ptr;
SAFE_PTR_SET(ptr, "hello world");
// ошибка компиляции
// const char *s2 = ptr;
if (SAFE_PTR_CHECK(ptr)) {
puts(SAFE_PTR_GET(ptr));
}
SAFE_PTR_SET(ptr, NULL);
const char *s = SAFE_PTR_GET(ptr); // abort
printf("%s\n", s ? s : "null");
return 0;
}
Сюда добавить можно NOT_NULL_SAFE_PTR, в сеттере задать ему через правила gcc не принимать выведенные компилятором NULL значения, и допускать только другие NOT_NULL_SAFE_PTR и сделать NOT_NULL_SAFE_PTR_FROM(OBJ)
Исходная версия MOPKOBKA, :
На самом деле идея крайне проста, вот C Safe Ptr v 0.0.0.0.1
#include <stdio.h>
#include <stdlib.h>
#define SAFE_PTR(TYPE) struct{TYPE p;}
#define SAFE_PTR_SET(NAME, V) NAME.p = V;
#define SAFE_PTR_CHECK(NAME) (NAME.p != NULL)
#define SAFE_PTR_GET(NAME) ({ \
if (!NAME.p) abort(); \
NAME.p; \
})
int main() {
SAFE_PTR(const char*) ptr;
SAFE_PTR_SET(ptr, "hello world");
// ошибка компиляции
// const char *s2 = ptr;
if (SAFE_PTR_CHECK(ptr)) {
puts(SAFE_PTR_GET(ptr));
}
SAFE_PTR_SET(ptr, NULL);
const char *s = SAFE_PTR_GET(ptr); // abort
printf("%s\n", s ? s : "null");
return 0;
}