From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on sa.local.altlinux.org X-Spam-Level: X-Spam-Status: No, score=-4.3 required=5.0 tests=ALL_TRUSTED,BAYES_00, RP_MATCHES_RCVD autolearn=unavailable autolearn_force=no version=3.4.1 To: devel@lists.altlinux.org References: <20200622104109.GA16954@imap.altlinux.org> <048dc43b-7585-02df-41b5-48be0ea73e78@basealt.ru> <98c5fdf0-c4bb-cc19-cf81-fd9e2f011e03@basealt.ru> <20200623094948.GA11840@imap.altlinux.org> From: Alexey Sheplyakov Message-ID: <24750326-954a-1f35-2227-725ce3827611@basealt.ru> Date: Tue, 23 Jun 2020 19:29:25 +0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.8.0 MIME-Version: 1.0 In-Reply-To: <20200623094948.GA11840@imap.altlinux.org> Content-Type: text/plain; charset=koi8-r; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit Subject: Re: [devel] armh + libjpeg + c++ exceptions X-BeenThere: devel@lists.altlinux.org X-Mailman-Version: 2.1.12 Precedence: list Reply-To: ALT Linux Team development discussions List-Id: ALT Linux Team development discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 23 Jun 2020 15:29:30 -0000 Archived-At: List-Archive: List-Post: Добрый вечер! On 6/23/20 1:49 PM, Vladislav Zavjalov wrote: > В библиотеках C иногда используются callback'и, > и туда легко могут попасть исключения, если их использовать с C++. Могут. Например, вот так: $ cat exc-leak.c #include #include #include extern "C" void f(char const* str) { if (str[0] != 'x') throw 42; } extern "C" int doit(void (*f)(char const*)) { char *str = strdup("abc"); if (!str) return 1; f(str); free(str); return 0; } int main(int argc, char **argv) { try { doit(f); return 0; } catch (int x) { fprintf(stderr, "caught int: %d\n", x); return 1; } return 2; } $ g++ -g -Wall -x c++ exc-leak.c $ ./a.out caught int: 42 $ uname -m x86_64 Вроде бы работает. За исключением того, что free() не вызывается. А если б там был pthread_mutex_lock? $ valgrind --leak-check=yes -v ./a.out ==9334== ==9334== HEAP SUMMARY: ==9334== in use at exit: 4 bytes in 1 blocks ==9334== total heap usage: 3 allocs, 2 frees, 72,840 bytes allocated ==9334== ==9334== Searching for pointers to 1 not-freed blocks ==9334== Checked 111,592 bytes ==9334== ==9334== 4 bytes in 1 blocks are definitely lost in loss record 1 of 1 ==9334== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==9334== by 0x547A9B9: strdup (strdup.c:42) ==9334== by 0x108A0F: doit (exc-leak.c:11) ==9334== by 0x108A5D: main (exc-leak.c:21) ==9334== ==9334== LEAK SUMMARY: ==9334== definitely lost: 4 bytes in 1 blocks ==9334== indirectly lost: 0 bytes in 0 blocks ==9334== possibly lost: 0 bytes in 0 blocks ==9334== still reachable: 0 bytes in 0 blocks ==9334== suppressed: 0 bytes in 0 blocks ==9334== ==9334== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0) ==9334== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0) asheplyakov@alexnuc:~/work/armhf$ Бросаться из C кода C++ исключениями -- почти всегда плохо. Единственное, для чего бы я так делал -- аварийное завершение программы. Так что те ABI/архитектуры, которые это лихачество НЕ позволяют, делают проблему явной и облегчают жизнь программиста. > И такую проблему может быть тяжело заметить. 1) valgrind (даже на x86) отлавливает многие такие лихачества (потому что они зачастую приводят к утечке памяти) 2) arm одноплатников ценой < 2000 р полно, легко собрать и запустить. Cойдет и rpi[234] (с 32-bit gnueabi userspace) 3) qemu-user позволяет не тратиться на одноплатники. > Наверное, если не собирать вообще всё с -funwind-tables, > то было бы правильно уметь отлавливать такие ситуации. > Например, сделать какую-то добавку в rpm set provides/requires, > чтобы приложения, собранные с этим самым EXIDX зависели от библиотек > с EXIDX. Убежден, что кривой код нужно чинить, а не изобретать средства, позволяющие ему и дальше быть кривым.