segmentation fault while using ctypes

sanket sanket.s.patel at gmail.com
Tue Apr 14 19:04:21 EDT 2009


On Apr 14, 4:00 pm, MRAB <goo... at mrabarnett.plus.com> wrote:
> sanket wrote:
> > Hello All,
>
> > I am dealing with this weird bug.
> > I have a function in C and I have written python bindings for it using
> > ctypes.
>
> > I can call this function for couple of times and then suddenly it
> > gives me seg fault.
> > But I can call same function from a C code for any number of times.
>
> > I cannot get what's going on.
>
> > here is my code.
>
> > /**********************************************/
> > /* C Function I am calling */
> > int get_hash(char *filename,int rate,int ch,unsigned char* hash,
> > unsigned int* hash_size,short* avg_f,short* avg_d){
>
> > /* some variable declarations here */
> > fp = fopen(filename,"rb");
>
> You should check the value of 'fp' here.
>
> > data = (signed short *)malloc(sizeof(signed short) * N_BLOCKS);
>
> You should check the value of 'data' here.
>
> > whereami = WAVE_HEADER_SIZE;
>
> What is 'whereami'?
>
> > while((!feof(fp)) && (fp_more == 1) && !ferror(fp)){
> >      fp_data_size = fread(data,sizeof(signed short),N_BLOCKS,fp);
>
> 'fp_data_size' will be the number of signed shorts read, not the number
> of bytes. Is this OK?
>
> >      whereami += fp_data_size;
>
> The final value of 'whereami' will be WAVE_HEADER_SIZE + the total
> number of signed shorts read.
>
> >      fp_more = fp_feed_short(fooid,data,fp_data_size); // call to some
> > library funtion
> >  } //end while
>
> > /* some arithmetic calculations here */
>
> >   n = my_fp_calculate(fooid,audio_length,fp_fingerprint,&fit,&dom);
>
> >   if (data != NULL)
> >       free(data)
>
> I don't that 'free()' will complain if 'data' happens to be NULL,
> although you should've already checked whether 'data' is NULL when you
> malloc'ed! :-)
>
> >   fclose(fp)
> >   return n;
> > }
>
> > /************************* END OF C FUNCTION
> > *********************************/
> > --------------------------------------------------------------------
> > Python code
> > ---------------------------------------------------------------------
> > from ctypes import *
> > lib = cdll.LoadLibrary("/usr/lib/libclient.so")
>
> > def my_func(filename,rate,ch):
> >     hash = (c_ubyte * 424)()
> >     hash_size = c_uint()
> >     avg_f = c_short(0)
> >     avg_d = c_short(0)
> >     n = lib.get_hash(filename,rate,ch,hash,byref(hash_size),byref
> > (avg_f),byref(avg_d))
> >     hash = None
>
> > def main():
> >     for filename in os.listdir(MY_DIR):
> >             print filename
> >             my_func(filename,100,10)
> >             print
> > "----------------------------------------------------"
>
> > if __name__ == "__main__":
> >     main()
>
> > ============== END OF PYTHON CODE ==========================
>
> > Thank you in advance,
> > sanket
> > --
> >http://mail.python.org/mailman/listinfo/python-list
>
>

Thank you for your reply.

I will make check for fp and data pointers.
But my point is this function runs fine while calling it from a C
code.
it only breaks while calling from python. So I wonder if there can be
anything wrong with ctypes module.

Thanks,
sanket





More information about the Python-list mailing list