fix(cl): avoid panicking on a BlockPointer member during union accessor generation

Aperta
#1,135 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
3/5
Tempo stimato
1-2 giorni
Idoneità per principianti
72/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
c, go, macos
Ambito
tooling

Direzione di ricerca

Start with genUnionAccessor and trace its calls through toType and toTypeEx, using the glob_t anonymous union and source/llcppg.cfg configuration as the reproduction. Run GOOS=darwin GOARCH=arm64 llcppg ./generated ./source with the macOS headers in source/darwin-arm64/include. Done means generation does not panic and clearly reports the unsupported Blocks callback without presenting the partially emitted record as complete or treating it as an ordinary C function pointer.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

A Blocks callback member classified as unsupported/quietly ignored by toTypeEx becomes a hard panic when the same conversion is requested by a union accessor. The macOS glob_t header triggers this path.

Reproduction

Use a source Go module requiring github.com/goplus/lib v0.7.0, with this configuration in source/llcppg.cfg:

{
  "Name": "libc",
  "Language": "c",
  "Dir": "$GOOS-$GOARCH/include",
  "Files": [
    "glob.h"
  ],
  "FailFast": 0,
  "IgnoreInline": true
}

Put the selected inputs under source/darwin-arm64/include, with the macOS 14.0 SDK headers available there where included. Leave Stdlib unset, and run:

GOOS=darwin GOARCH=arm64 llcppg ./generated ./source

The SDK's glob_t contains this anonymous union when __BLOCKS__ is defined by the selected target:

union {
    int (*gl_errfunc)(const char *, int);
    int (^gl_errblk)(const char *, int);
};

Actual result

Generation exits 2:

panic: unsupported type - int (^)(const char *, int)

The stack is genUnionAccessor -> toType -> toTypeEx. toTypeEx explicitly sets featQuietIgnore for Type_BlockPointer, but toType turns any ignore feature into a panic. genUnionAccessor uses this strict entry point without handling the unsupported member result.

Expected behavior

Handle this unsupported type deliberately and report its impact on the generated binding without panicking. Do not silently represent a Blocks callback as an ordinary C function pointer or claim that a partially emitted record is complete. Implementing full Blocks ABI support is a separate decision.

Merged #874 introduced the unsupported-type handling; it does not cover this union-accessor crash. This is also distinct from #1032's missing registration of named records.

Environment

Reproduced on macOS/arm64 with LLVM/libclang 22.1.8, LLGo 1.0.9 and github.com/goplus/lib v0.7.0. The relevant installed generator sources were checked byte-for-byte against current main 90bd72cf. SDK-dependent cases use macOS 14.0 headers. These are generation-stage results, not cross-platform or ABI certification.

Lingua principale
Go
Stelle
40
Fork
13
Merge medio
2h 4m
PR unite (30g)
143

Preparare l'ambiente

Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di goplus/llcppg

Tutte le issue di goplus/llcppg

Issue simili

Altre issue su Go

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.