0

I have made a library that handle strings in c.

I've added it in another project CMakeLists. Issue is that, whenever i want to call a function from that library, it crash.

However, if i call the same function from the library itself, no crash, the function call is handled properly.

I kept thinking that i did something wrong with my CMakeLists but as far as i'm aware and the different methods i used to arrive to the same conclusion, it doesn't look like it anymore.

I tried running the test in question in gdb and this is what it returned

Starting program: C:\Users\s\Documents\Repo\C\Projet\lib\rule\build\test-create-destroy.exe
gdb: unknown target exception 0xc0000135 at 0x7ffdfa70cf40
gdb: unknown target exception 0xc0000135 at 0x7ffdfa70cf40

Program received signal ?, Unknown signal.
0x00007ffdfa70cf40 in ntdll!RtlRaiseStatus () from C:\Windows\SYSTEM32\ntdll.dll

I've read that it could be an issue related to memory allocation errors, but if this was the case, why would i be able to call the function without any error directly from my library?

replit of fairly simple example: https://replit.com/@Mrcubix-Mrcubix/EmbellishedOldfashionedBaitware#lib/rule/src/test-create-destroy.c


Here is the function called in the library in question, to keep it simple:

#include <string.h>
#include <stdlib.h>
#include <stdio.h>

typedef struct _String
{
    unsigned int size;
    char *string;
} String;

String *create_string(char *chr)
{
    String *str = malloc(sizeof(String));

    str->size = strlen(chr);
    str->string = malloc(str->size + 1);
    memcpy(str->string, chr, str->size);
    str->string[str->size] = '\0';

    return str;
}

void destroy_string(String *str)
{
    free(str);
}

Here the second library i'm calling a function from which work as it's part of the same project:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <string-struct.h>

typedef struct _rule
{
    String *premise;
    String *conclusion;
} rule;

rule *create_rule(String *premise, String *conclusion) 
{
    rule *r = calloc(1, 16);

    r->premise = premise;
    r->conclusion = conclusion;

    return r;
}

void destroy_rule(rule *r)
{
    free(r);
}

here is the CMakeLists used by Rulestruct:

cmake_minimum_required(VERSION 3.0)

project("Rulestruct")

find_package(Stringstruct)
include_directories(${STRINGSTRUCT_INCLUDE_DIRS})
link_directories(${STRINGSTRUCT_LIB_DIRS})

add_library(rulestruct SHARED "${CMAKE_CURRENT_SOURCE_DIR}/src/rule-struct.c" "${CMAKE_CURRENT_SOURCE_DIR}/src/rule-struct.h")
target_link_libraries(rulestruct ${STRINGSTRUCT_LIBRARIES})

add_executable(test-create-destroy "${CMAKE_CURRENT_SOURCE_DIR}/src/test-create-destroy.c" "${CMAKE_CURRENT_SOURCE_DIR}/src/rule-struct.h")

add_dependencies(test-create-destroy rulestruct)

target_link_libraries(test-create-destroy rulestruct)

and finally, here is where i call the function from (test-create-destroy.c)

#include <assert.h>
#include <string-struct.h>
#include "rule-struct.h"
#include "rules-struct.inc"


int main(void)
{
    String *premise = create_string("1 2"); // location of crash
    String *conclusion = create_string("3"); // location of crash

    /*rule *rule_A = create_rule(premise, conclusion);

    assert(string_char_equal(rule_A->premise, "1 2"));
    assert(!string_char_equal(rule_A->premise, "3"));
    assert(string_char_equal(rule_A->conclusion, "3"));
    assert(!string_char_equal(rule_A->conclusion, "1 2"));

    destroy_rule(rule_A);*/

    destroy_string(premise);
    destroy_string(conclusion);
}

Here are screenshots of bin, lib and cmake-gui: https://i.stack.imgur.com/Q7HTv.jpg

I could probably fix it on every project provided i know what i did wrong and why, So if anyone could provide further explanation then i'll glad to read it.

I will also take tips about issues or potential issues related to my CMakeLists as i have a hard time understanding any of it, needing to mix multiple examples and the documentation to have a very small bit of understanding of why something is done this or that way.

TLDR: Function called elsewhere than inside the library = crash, accept tips about other parts of the presented data (CMakeLists). Gladly accept further explanation of the core of the issue.

Gess1t
  • 71
  • 1
  • 9
  • `calloc(1, 16);` should be `calloc(1, sizeof(rule));` – Barmar Dec 07 '21 at 21:06
  • You should only use `#include <...>` around system header files. Header files from your project should be in `#include "..."` – Barmar Dec 07 '21 at 21:07
  • Post the code for `test-create-destroy.c` – Barmar Dec 07 '21 at 21:07
  • it's available in the replit link provided but i'll add it here too – Gess1t Dec 07 '21 at 21:14
  • "unknown target exception 0xc0000135" smells like dll-not-found error. – Tsyvarev Dec 07 '21 at 21:21
  • you could be right although i have no way knowing, but here are some screenshots of my lib, bin and cmake-gui https://imgur.com/a/3OdrC2D (i'll be adding those to the thread) – Gess1t Dec 07 '21 at 21:25
  • Your lib, bin and cmake-gui has no relation with dll-not-found error. You need to add directory with your library to `PATH` environment variable or copy the library near the executable. See e.g. [that question](https://stackoverflow.com/questions/65472823/qt-error-exit-code-1073741515-0xc0000135) – Tsyvarev Dec 07 '21 at 22:23
  • It seem like you found the problem, the program now execute normally, Thanks. It seem like i was searching the wrong thing before making the thread, should take a look into the error code next time. Feel free to post it as the answer, i'll accept it. – Gess1t Dec 07 '21 at 22:43

0 Answers0