LINUX.ORG.RU

Куда репортить баг?

 , , ,


0

1

Полагаю, что это всё же баг, а не фича.

В общем, у меня в коде используется fftw3, я по своей невнимательности вместо fftw_free использовал free. Из контрольных флагов gcc были Wall, Wextra, pedantic-errors.

Код компилился без ошибок, выполнялся - тоже (я кое-какие небольшие числа проверял руками - всё верно). Но тут я перешёл на icc (и опять никаких ошибок) и код начал падать при освобождении матриц. Думаю, что нужно как-то это зарепортить, но хз - куда.

★★★★★
Ответ на: комментарий от pon4ik

Зачем бектрейс, если очевидно, что использование free вместо fftw_free и есть ошибка (в предположении, что других ошибок нет)?

xaizek ★★★★★
()
Последнее исправление: xaizek (всего исправлений: 1)
Ответ на: комментарий от xaizek

Затем, что даже в твоём утверждении есть если :)

pon4ik ★★★★★
()

Думаю, что нужно как-то это зарепортить, но хз - куда.

В багтрекер твоего унылого говнокода. Хотя вряд ли он существует.

anonymous
()

Это баг недоязыка C, где из-за убогости модели типизации в котором не обойтись без void*. Никто более в этом не виноват - компилятор не должен на это ругаться и авторы библиотеки ничего с этим сделать не смогут. Тебя спасёт обёртка на C++ или любом другом нормально типизированном языке.

slovazap ★★★★★
()
Ответ на: комментарий от slovazap

Ага, разные типы для указателей из разных аллокаторов, а все функции должны быть шаблонными и принимать T вместо float*.

vzzo ★★★
()
Ответ на: комментарий от slovazap

mymem.h:


#ifndef MYMEM_H
#define MYMEM_H


typedef struct mymem { void * Implementation ; } mymem ;

void * mymem_bytes ( mymem ) ;
mymem  mymem_alloc ( int   ) ;
void   mymem_free  ( mymem ) ;


#endif

usage.c:


#include <stdio.h>
#include "mymem.h"


int main ( void )
{
   int    const M1Size  = 100                 ;
   mymem  const M1      = mymem_alloc(M1Size) ;
   char * const M1Chars = mymem_bytes(M1)     ;

   (void)sprintf(M1Chars,"M1 Size = %d",M1Size) ;

   puts(M1Chars) ;

   mymem_free(M1) ;   
   return 0 ;
}

mymem.c:


#include <stdlib.h>
#include "mymem.h"


void * mymem_bytes ( mymem const M )
{
   void * const Bytes = M.Implementation ;
   return Bytes                          ;
}


mymem mymem_alloc ( int const Size )
{
   size_t const Sz  = (size_t)Size ;
   void * const Ptr = malloc(Sz)   ;

   mymem M                ;
   M.Implementation = Ptr ;
   return M               ;
}


void mymem_free ( mymem const M )
{
   void * const Ptr = M.Implementation ;
   free(Ptr) ;
}

anonymous
()
Ответ на: комментарий от slovazap

((void(*)(void))0)() ;

*((int*)65536) = 0 ;

#define malloc(S) ((S) % 10 ? malloc((S)) : 0)

и ещё много способов стрельнуть в ногу от которых никак не спастись.

пкм пожно сделать строгую типизацию для разных своих сущностей.

anonymous
()

Неправильный код не обязан работать неправильно.

Legioner ★★★★★
()
Ответ на: комментарий от anonymous

Есть разница между явным бредом и гарантированной возможностью выстрелить себе в ногу в ходе нормальной разработки. Последнее и отличает C от ЯП.

slovazap ★★★★★
()
Ответ на: комментарий от slovazap

Нормальная разработка - это написание программ по спецификации языка и библиотек. Если не читать мануалы и писать от потолка то получаешь UB. Программа с UB не является валидной c-программой. Следовательно, написанная на языке 'c' программа никогда сама не упадёт.

anonymous
()
Ответ на: комментарий от anonymous

Это пустословие. У Malbolge тоже есть спецификация, и если ей не следовать получишь неопределённое поведение. Существенно то какова вероятность его получить на ровном месте. У C эта вероятность превышает допустимую для современной разработки. Проще говоря, есть языки на которых можно писать и их нужно использовать, а на C нельзя писать - там, как вы точно заметили, нужно вместо этого читать спецификации.

slovazap ★★★★★
()
Ответ на: комментарий от slovazap

Т.е., в переводе на русский, обезьянка с клавой не смогла прочитать стандарт и пару книжек по си, и пишет с UB. А на каком-нибудь c#, пишет чегото типа-рабочее со сборщиком мусора. Поэтому c-говно, а c#-хороший язык.

anonymous
()
Ответ на: комментарий от anonymous

Ну форма конечно страдает, но по сути именно так.

Не обезьянка, а грамотный, профессиональный разработчик, который выбирает рабочие, эффективные и безопасные инструменты. А вот на C сейчас действительно будет писать только обезьяна, в том смысле что предшественник человека разумного по эволюционной лестнице, и половину времени, своего или работодателя, она будет читать стандарты и книги, а вторую всё равно наступать на грабли из которых построен C. Само существование этого топика подтверждает мою правоту - сколько ты не выгораживай язычок дальше которого ты не продвинулся, а человек совершил ошибку, в которой виноват исключительно C, и которая в языках программирования невозможна как класс.

slovazap ★★★★★
()
Ответ на: комментарий от slovazap

Ну байткод это конечно хорошо, но он неконкурентоспособен. Есть плюсы и плюсы, выбирай. Ещё можно на си писать и не иметь плюсового оверхэда, и на ассемблере и не иметь сишного оверхэда. Вопрос предпочтений и совершенно разные уровни, некоторые просто не могут нормально писать, если только компилятор не будет их унижать каждую минуту (это те же люди что отключают очевидно адекватные проверки).

anonymous
()
Ответ на: комментарий от Deathstalker

Точно. У них там только мета-код лежит, сами сборки доступны отдельно, вот я и забыл про это.

ZERG ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.