LINUX.ORG.RU

История изменений

Исправление 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;
}