[asterisk-bugs] [JIRA] (ASTERISK-20850) nested functions aren't portable

Diederik de Groot (JIRA) noreply at issues.asterisk.org
Thu Oct 10 09:41:04 CDT 2013


    [ https://issues.asterisk.org/jira/browse/ASTERISK-20850?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=210846#comment-210846 ] 

Diederik de Groot edited comment on ASTERISK-20850 at 10/10/13 9:40 AM:
------------------------------------------------------------------------

Example of a possible clang solution (using blocks & cleanup):

===============================
#include <stdio.h>
#include <malloc.h>

#ifndef __has_feature
#define __has_feature(f) 0
#endif

#if __has_feature(blocks)
typedef void (^_raii_cleanup_block_t)(void);
static inline void _raii_cleanup_block(_raii_cleanup_block_t *b) { (*b)(); }
#define RAII_VAR(vartype, varname, initval, dtor)                                                                       \
    _raii_cleanup_block_t _raii_cleanup ## varname __attribute__((cleanup(_raii_cleanup_block),unused)) = NULL;      \
    vartype varname = initval;                                                                                          \
    _error_cleanup ## varname = ^{ dtor(varname); }
#elif __GNUC__
#define RAII_VAR(vartype, varname, initval, dtor)                                                                       \
    auto void _dtor_ ## varname (vartype * v);                                                                          \
    void _dtor_ ## varname (vartype * v) { dtor(*v); }                                                                  \
    vartype varname __attribute__((cleanup(_dtor_ ## varname))) = (initval)
#else   
    #warning "Your compiler is not supported"
#endif

struct teststruct {
    int testA;
    char testB[10];
};

int main (void) {
    RAII_VAR(struct teststruct *, testvar, malloc(sizeof(struct teststruct)), free);
    testvar->testA=10;
    printf("testvar->testA: %d\n", testvar->testA);
    return 0;
}
===============================
Compile using:
clang -fblocks 
Or:
clang -fblocks -lBlocksRuntime 
                
      was (Author: dkdegroot):
    Example of a possible clang solution (using blocks & cleanup):

===============================
#include <stdio.h>
#include <malloc.h>

#ifndef __has_feature
#define __has_feature(f) 0
#endif

#if __has_feature(blocks)
typedef void (^_raii_cleanup_block_t)(void);
static inline void _raii_cleanup_block(_error_cleanup_block_t *b) { (*b)(); }
#define RAII_VAR(vartype, varname, initval, dtor)                                                                       \
    _raii_cleanup_block_t _raii_cleanup ## varname __attribute__((cleanup(_raii_cleanup_block),unused)) = NULL;      \
    vartype varname = initval;                                                                                          \
    _error_cleanup ## varname = ^{ dtor(varname); }
#elif __GNUC__
#define RAII_VAR(vartype, varname, initval, dtor)                                                                       \
    auto void _dtor_ ## varname (vartype * v);                                                                          \
    void _dtor_ ## varname (vartype * v) { dtor(*v); }                                                                  \
    vartype varname __attribute__((cleanup(_dtor_ ## varname))) = (initval)
#else   
    #warning "Your compiler is not supported"
#endif

struct teststruct {
    int testA;
    char testB[10];
};

int main (void) {
    RAII_VAR(struct teststruct *, testvar, malloc(sizeof(struct teststruct)), free);
    testvar->testA=10;
    printf("testvar->testA: %d\n", testvar->testA);
    return 0;
}
===============================
Compile using:
clang -fblocks 
Or:
clang -fblocks -lBlocksRuntime 
                  
> nested functions aren't portable
> --------------------------------
>
>                 Key: ASTERISK-20850
>                 URL: https://issues.asterisk.org/jira/browse/ASTERISK-20850
>             Project: Asterisk
>          Issue Type: Bug
>      Security Level: None
>          Components: General
>    Affects Versions: 11.1.0
>         Environment: CLANG
>            Reporter: John Nemeth
>
> Nested functions are a GCC extension that is not sanctioned by C standards, thus the use of them is non-portable.  Specifically, CLANG does not support them.  CLANG is used by OSX, current versions of FreeBSD, and NetBSD is experimenting with it.  The RAII_VAR macro in include/asterisk/utils.h creates nested functions.  This prevents Asterisk 11.* from compiling with CLANG.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.asterisk.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira



More information about the asterisk-bugs mailing list