2015-01-08 15 views
12

Sto imparando il linguaggio C da Learn C The Hard Way. Sono al numero exercise 6 e mentre riesco a farlo funzionare, valgrind registra molti errori.Valgrind segnala errori per un programma C molto semplice

Ecco il ridotta programma minimo da un file ex6.c:

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    char initial = 'A'; 
    float power = 2.345f; 

    printf("Character is %c.\n", initial); 
    printf("You have %f levels of power.\n", power); 

    return 0; 
} 

Contenuto Makefile è solo CFLAGS=-Wall -g.

Compilare il programma con $ make ex6 (non sono presenti avvisi o errori del compilatore). L'esecuzione con $ ./ex6 produce l'output previsto.

Quando eseguo il programma con $ valgrind ./ex6 ottengo errori che non riesco a risolvere. Ecco l'output completo:

==69691== Memcheck, a memory error detector 
==69691== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al. 
==69691== Using Valgrind-3.11.0.SVN and LibVEX; rerun with -h for copyright info 
==69691== Command: ./ex6 
==69691== 
--69691-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option 
--69691-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option (repeated 2 times) 
--69691-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option (repeated 4 times) 
==69691== Conditional jump or move depends on uninitialised value(s) 
==69691== at 0x1003FBC3F: _platform_memchr$VARIANT$Haswell (in /usr/lib/system/libsystem_platform.dylib) 
==69691== by 0x1001EFBB6: __sfvwrite (in /usr/lib/system/libsystem_c.dylib) 
==69691== by 0x1001FA005: __vfprintf (in /usr/lib/system/libsystem_c.dylib) 
==69691== by 0x10021F9CE: __v2printf (in /usr/lib/system/libsystem_c.dylib) 
==69691== by 0x10021FCA0: __xvprintf (in /usr/lib/system/libsystem_c.dylib) 
==69691== by 0x1001F5B91: vfprintf_l (in /usr/lib/system/libsystem_c.dylib) 
==69691== by 0x1001F39F7: printf (in /usr/lib/system/libsystem_c.dylib) 
==69691== by 0x100000F1B: main (ex6.c:8) 
==69691== 
Character is A. 
==69691== Invalid read of size 32 
==69691== at 0x1003FBC1D: _platform_memchr$VARIANT$Haswell (in /usr/lib/system/libsystem_platform.dylib) 
==69691== by 0x1001EFBB6: __sfvwrite (in /usr/lib/system/libsystem_c.dylib) 
==69691== by 0x1001FA005: __vfprintf (in /usr/lib/system/libsystem_c.dylib) 
==69691== by 0x10021F9CE: __v2printf (in /usr/lib/system/libsystem_c.dylib) 
==69691== by 0x10021FCA0: __xvprintf (in /usr/lib/system/libsystem_c.dylib) 
==69691== by 0x1001F5B91: vfprintf_l (in /usr/lib/system/libsystem_c.dylib) 
==69691== by 0x1001F39F7: printf (in /usr/lib/system/libsystem_c.dylib) 
==69691== by 0x100000F31: main (ex6.c:9) 
==69691== Address 0x100809680 is 32 bytes before a block of size 32 in arena "client" 
==69691== 
You have 2.345000 levels of power. 
==69691== 
==69691== HEAP SUMMARY: 
==69691==  in use at exit: 39,365 bytes in 429 blocks 
==69691== total heap usage: 510 allocs, 81 frees, 45,509 bytes allocated 
==69691== 
==69691== LEAK SUMMARY: 
==69691== definitely lost: 16 bytes in 1 blocks 
==69691== indirectly lost: 0 bytes in 0 blocks 
==69691==  possibly lost: 13,090 bytes in 117 blocks 
==69691== still reachable: 26,259 bytes in 311 blocks 
==69691==   suppressed: 0 bytes in 0 blocks 
==69691== Rerun with --leak-check=full to see details of leaked memory 
==69691== 
==69691== For counts of detected and suppressed errors, rerun with: -v 
==69691== Use --track-origins=yes to see where uninitialised values come from 
==69691== ERROR SUMMARY: 5 errors from 2 contexts (suppressed: 0 from 0) 

Sono su OS X yosemite. Valgrind è installato tramite brew con questo comando $ brew install valgrind --HEAD.

Quindi, qualcuno sa qual è il problema qui? Come posso correggere gli errori valgrind?

+0

Stai collegando ad una libreria esterna? –

+2

Sul mio Linux, il tuo esempio non riporta alcun errore. Nella barra laterale Link correlati, c'è [uno che suggerisce l'uso di file di soppressione] (http://stackoverflow.com/questions/5226691/valgrind-mac-os-mem-leak?rq=1). –

+0

@IngoLeonhardt: Gli argomenti Variadic di tipo 'float' vengono promossi a' double', quindi non dovrebbe essere un problema. (E il prototipo corretto è in "", che è stato incluso.) –

risposta

12

Se il programma su cui si sta eseguendo Valgrind è esattamente quello che hai inserito nella domanda, chiaramente non ha perdite di memoria. Infatti, non usi nemmeno malloc/free!

Mi sembra che si tratti di errori spuri/falsi positivi rilevati da Valgrind su OS X (solo!), Simile a what happened to myself some time ago.

Se si ha accesso a un diverso sistema operativo, ad es. una macchina Linux, prova ad analizzare il programma usando Valgrind su quel sistema.

EDIT: Non ho provato io stesso, dal momento che non ho accesso a un Mac in questo momento, ma si dovrebbe provare quello che M Oehm suggerito: try to use a supressions file as mentioned in this other SO question.

+0

Non sono riuscito a trovare un file di soppressione per OS X Yosemite. Quello da quella risposta SA non ha avuto alcun effetto sull'output di Valgrind. D'altra parte, facendo lo stesso passo in vagabondo con Linux ha prodotto un output pulito di Valgrind. –

+0

Ho confermato questo sulla mia macchina. Ho duplicato questo semplice programma su Mac OS X, eseguito con Valgrind e ottenuto un salto condizionato. – brandaemon

1

A giudicare dall'argomento this, presumo che valgrind non garantisca risultati corretti sulla piattaforma. Se puoi, prova questo codice su un'altra piattaforma.

Il colpevole è o in valgrid stesso o nell'implementazione del sistema di printf, entrambi i quali sarebbero poco pratici da risolvere.

Rerun with --leak-check=full to see details of leaked memory. Questo dovrebbe darti qualche informazione in più sulla perdita che stai riscontrando. Se nulla aiuta, puoi creare un suppression file per impedire la visualizzazione degli errori.

+0

Al momento non è possibile creare un file di soppressione per "Lettura non valida della dimensione 32". C'è questo nuovo errore nella porta Darwin, ma non è ancora supportato per sopprimere gli errori con una dimensione maggiore di 16. Dovrebbe essere una questione di tempo per farlo implementare (sembra una soluzione banale). – antirez

10

Questo problema è stato risolto per Darwin 14.3.0 (Mac OS X 10.10.2) utilizzando Valgrind r14960 with VEX r3124 per Xcode6.2 e Valgrind r15088 per Xcode 6.3.

Se si utilizza Macports (al momento della scrittura), sudo port install valgrind-devel fornisce Valgrind r14960 with VEX r3093.

Ecco il mio script di build di installare Valgrind r14960 with VEX r3124:

#! /usr/bin/env bash 

mkdir -p buildvalgrind 
cd buildvalgrind 
svn co svn://svn.valgrind.org/valgrind/trunk/@14960 valgrind 
cd valgrind 
./autogen.sh 
./configure --prefix=/usr/local 
make && sudo make install 

# check that we have our valgrind installed 
/usr/local/bin/valgrind --version 

(riferimento: http://calvinx.com/2015/04/10/valgrind-on-mac-os-x-10-10-yosemite/)

mio macports-installati valgrind si trova a /opt/local/bin/valgrind.

Se ora corro

/opt/local/bin/valgrind --leak-check=yes --suppressions=`pwd`/objc.supp ./ex6

mi metterò esattamente gli stessi errori che hai descritto sopra. (Usando il mio file objc.supp qui https://gist.github.com/calvinchengx/0b1d45f67be9fdca205b)

Ma se correre

/usr/local/bin/valgrind --leak-check=yes --suppressions=`pwd`/objc.supp ./ex6

Tutto funziona come previsto e non ottenere gli errori di perdita di memoria a livello di sistema rivelando.

Problemi correlati