Невозможно создать экземпляр приложения com.android.tools.fd.runtime.BootstrapApplication? Android

Vayn,

Geekoaur ответил на ваш вопрос хорошо, я просто указываю еще одну «проблему» с вашим кодом.

Строка s1[strlen(s1)] = '\0'; - это no-op , если s1 уже полностью нулевое завершение до того, как оно выполняется.

Но если s1 NOT allready должным образом завершено нулем до того, как эта строка выполняется (и вам не повезло), это приведет к:

Это связано с тем, что strlen basicaly находит индекс существующего нуль-терминатора и возвращает его! Вот действительная, неоптимизированная реализация strlen:

int strlen(char *string) {
    int i = 0;
    while(string[i] != '\0') {
        ++i;
    }
    return i;
}

Итак ... Если вы ДЕЙСТВИТЕЛЬНО беспокоитесь о том, что строки НЕ были обнулены нулями, вы бы сделали что-то вроде:

  • string[sizeof(string)]='\0'; в локальных автоматических строках (где компилятор «знает» размер строки);
  • или string[SIZE_OF_STRING] для всех остальных строк, где SIZE_OF_STRING является (чаще всего) константой #define 'd или переменной, которую вы поддерживаете специально для хранения текущего SIZE (не длина) динамически выделяемой строки.

И если вы ДЕЙСТВИТЕЛЬНО, ДЕЙСТВИТЕЛЬНО, ДЕЙСТВИТЕЛЬНО беспокоились о том, что строки не заканчиваются на нуль (например, вы имеете дело с «грязными» методами libary (например, Tuxedo's ATMI, например), вы также «очищаете» свои «возвращаемые строки» перед передачей их методам подозрительной библиотеки с помощью:

  • до: memset(string, NULL, SIZE_OF_STRING);
  • invoke: DirtyFunction(/*out*/string);
  • после: string[SIZE_OF_STRING]='\0'

SIG11 - это полная привязка для поиска, потому что (если вы не «подключите» их к сигнальному процессору и сказать иначе, они заставляют unix жестко завершать вашу программу, поэтому вы не можете ничего регистрировать (после факта), чтобы помочь выяснить, где-в-а-а-а-а-о-о-о-о ... особенно учитывая, что во многих случаях строка кода, которая выбрасывает SIG11, не находится рядом с фактической причиной потери строки это нуль-терминатор.

Разве это имеет для вас смысл?

Cheers mate. Keith.

PS: ПРЕДУПРЕЖДЕНИЕ: strncpy НЕ все время имеет нулевое значение ... вы, вероятно, имели в виду strlcpy. Я усвоил этот трудный путь ... когда сработал биллинг на 60 миллионов долларов.


EDIT:

FYI: Вот «безопасная» (неоптимизированная) версия strlen который я назову strnlen (я считаю, что это должно быть в stdlib . Вздох.).

// retuns the length of the string (capped at size-1)
int strnlen(char *string, int size) {
    int i = 0;
    while( i

140
задан Wasim K. Memon 20 June 2017 в 16:31
поделиться