Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:23
erlang
0404-erts-Add-asserts-to-suppress-false-positiv...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0404-erts-Add-asserts-to-suppress-false-positives-found-b.patch of Package erlang
From 0b1820ed8789929547ee5ca04ac651bb415205a8 Mon Sep 17 00:00:00 2001 From: Lukas Larsson <lukas@erlang.org> Date: Thu, 25 Jun 2020 11:40:28 +0200 Subject: [PATCH 04/34] erts: Add asserts to suppress false positives found by clang sa --- erts/emulator/beam/beam_bif_load.c | 6 +- erts/emulator/beam/beam_bp.c | 7 ++- erts/emulator/beam/beam_debug.c | 6 +- erts/emulator/beam/bif.c | 2 +- erts/emulator/beam/dist.c | 2 + erts/emulator/beam/erl_async.c | 1 + erts/emulator/beam/erl_bif_re.c | 3 +- erts/emulator/beam/erl_bif_unique.c | 1 + erts/emulator/beam/erl_db.c | 1 + erts/emulator/beam/erl_db_catree.c | 6 ++ erts/emulator/beam/erl_db_tree.c | 4 ++ erts/emulator/beam/erl_db_util.c | 22 +++---- erts/emulator/beam/erl_gc.c | 3 +- erts/emulator/beam/erl_lock_check.c | 15 +++-- erts/emulator/beam/erl_lock_check.h | 5 +- erts/emulator/beam/erl_map.c | 6 ++ erts/emulator/beam/erl_message.h | 4 +- erts/emulator/beam/erl_msacc.h | 66 ++++++++++----------- erts/emulator/beam/erl_process.c | 1 + erts/emulator/beam/erl_process_lock.c | 4 +- erts/emulator/beam/erl_trace.c | 2 + erts/emulator/beam/external.c | 10 +++- erts/emulator/beam/global.h | 2 +- erts/emulator/beam/io.c | 1 + erts/emulator/drivers/common/inet_drv.c | 10 +++- erts/emulator/drivers/unix/ttsl_drv.c | 1 + erts/emulator/sys/common/erl_check_io.c | 4 +- erts/emulator/sys/common/erl_mmap.c | 6 +- erts/emulator/sys/common/erl_poll.c | 10 ++-- erts/emulator/sys/unix/sys.c | 2 +- erts/epmd/src/epmd_int.h | 6 ++ erts/epmd/src/epmd_srv.c | 1 + erts/etc/common/heart.c | 4 +- erts/etc/common/inet_gethost.c | 25 +++++++- erts/include/internal/ethread.h | 18 +++--- erts/lib_src/common/ethr_aux.c | 4 +- erts/lib_src/common/ethr_mutex.c | 2 +- erts/lib_src/yielding_c_fun/ycf_yield_fun.c | 2 +- 38 files changed, 174 insertions(+), 101 deletions(-) diff --git a/erts/emulator/beam/beam_bif_load.c b/erts/emulator/beam/beam_bif_load.c index 02da37cff6..14db75063d 100644 --- a/erts/emulator/beam/beam_bif_load.c +++ b/erts/emulator/beam/beam_bif_load.c @@ -77,13 +77,11 @@ init_purge_state(void) erts_export_put(am_erts_code_purger, am_pending_purge_lambda, 3); purge_state.sprocs = &purge_state.def_sprocs[0]; - purge_state.sp_size = sizeof(purge_state.def_sprocs); - purge_state.sp_size /= sizeof(purge_state.def_sprocs[0]); + purge_state.sp_size = sizeof(purge_state.def_sprocs) / sizeof(purge_state.def_sprocs[0]); purge_state.sp_ix = 0; purge_state.funs = &purge_state.def_funs[0]; - purge_state.fe_size = sizeof(purge_state.def_funs); - purge_state.fe_size /= sizeof(purge_state.def_funs[0]); + purge_state.fe_size = sizeof(purge_state.def_funs) / sizeof(purge_state.def_funs[0]); purge_state.fe_ix = 0; purge_state.saved_old.code_hdr = 0; diff --git a/erts/emulator/beam/beam_bp.c b/erts/emulator/beam/beam_bp.c index 2ec0b2a901..2142830ae8 100644 --- a/erts/emulator/beam/beam_bp.c +++ b/erts/emulator/beam/beam_bp.c @@ -718,7 +718,7 @@ erts_generic_breakpoint(Process* c_p, ErtsCodeInfo *info, Eterm* reg) new_tracer = do_call_trace(c_p, info, reg, 1, bp->meta_ms, old_tracer); if (!ERTS_TRACER_COMPARE(new_tracer, old_tracer)) { - if (old_tracer == erts_atomic_cmpxchg_acqb( + if ((erts_aint_t)old_tracer == erts_atomic_cmpxchg_acqb( &bp->meta_tracer->tracer, (erts_aint_t)new_tracer, (erts_aint_t)old_tracer)) { @@ -1129,6 +1129,8 @@ static void bp_hash_rehash(bp_time_hash_t *hash, Uint n) { Uint ix; Uint hval; + ASSERT(n > 0); + item = (bp_data_time_item_t *)Alloc(size); sys_memzero(item, size); @@ -1136,6 +1138,7 @@ static void bp_hash_rehash(bp_time_hash_t *hash, Uint n) { item[ix].pid = NIL; } + /* rehash, old hash -> new hash */ for( ix = 0; ix < hash->n; ix++) { @@ -1395,7 +1398,7 @@ set_function_break(ErtsCodeInfo *ci, Binary *match_spec, Uint break_flags, bp->count = bcp; } else if (break_flags & ERTS_BPF_TIME_TRACE) { BpDataTime* bdt; - int i; + Uint i; ASSERT((bp->flags & ERTS_BPF_TIME_TRACE) == 0); bdt = Alloc(sizeof(BpDataTime)); diff --git a/erts/emulator/beam/beam_debug.c b/erts/emulator/beam/beam_debug.c index d1ad71e7ac..b790aeaff8 100644 --- a/erts/emulator/beam/beam_debug.c +++ b/erts/emulator/beam/beam_debug.c @@ -458,7 +458,7 @@ print_op(fmtfn_t to, void *to_arg, int op, int size, BeamInstr* addr) * Copy all arguments to a local buffer for the unpacking. */ - ASSERT(size <= sizeof(args)/sizeof(args[0])); + ASSERT(size > 0 && size <= sizeof(args)/sizeof(args[0])); ap = args; for (i = 0; i < size; i++) { *ap++ = addr[i]; @@ -553,14 +553,14 @@ print_op(fmtfn_t to, void *to_arg, int op, int size, BeamInstr* addr) break; case 'S': /* Register */ { - Uint reg_type = (*ap & 1) ? 'y' : 'x'; + Uint reg_type = (ap[0] & 1) ? 'y' : 'x'; Uint n = ap[0] / sizeof(Eterm); erts_print(to, to_arg, "%c(%d)", reg_type, n); ap++; break; } case 's': /* Any source (tagged constant or register) */ - tag = loader_tag(*ap); + tag = loader_tag(ap[0]); if (tag == LOADER_X_REG) { erts_print(to, to_arg, "x(%d)", loader_x_reg_index(*ap)); ap++; diff --git a/erts/emulator/beam/bif.c b/erts/emulator/beam/bif.c index 41c7768111..c19ff6250c 100644 --- a/erts/emulator/beam/bif.c +++ b/erts/emulator/beam/bif.c @@ -1591,7 +1591,7 @@ static Eterm process_flag_aux(Process *c_p, int *redsp, Eterm flag, Eterm val) if (i == 0) scb = NULL; else { - Uint sz = sizeof(*scb) + (i-1) * sizeof(scb->ct[0]); + Uint sz = sizeof(*scb) + (i-1) * sizeof(*scb->ct); scb = erts_alloc(ERTS_ALC_T_CALLS_BUF, sz); scb->len = i; scb->cur = 0; diff --git a/erts/emulator/beam/dist.c b/erts/emulator/beam/dist.c index 077a288f72..30dffa13ee 100644 --- a/erts/emulator/beam/dist.c +++ b/erts/emulator/beam/dist.c @@ -2847,6 +2847,8 @@ erts_dsig_prepare(ErtsDSigSendContext *ctx, */ int res; + ASSERT(no_trap || proc); + if (!erts_is_alive) return ERTS_DSIG_PREP_NOT_ALIVE; if (!dep) { diff --git a/erts/emulator/beam/erl_async.c b/erts/emulator/beam/erl_async.c index ec116cb9f5..0f33459fa4 100644 --- a/erts/emulator/beam/erl_async.c +++ b/erts/emulator/beam/erl_async.c @@ -137,6 +137,7 @@ static void *async_main(void *); static ERTS_INLINE ErtsAsyncQ * async_q(int i) { + ASSERT(async != NULL); return &async->queue[i].aq; } diff --git a/erts/emulator/beam/erl_bif_re.c b/erts/emulator/beam/erl_bif_re.c index 3c2cc2e6d5..b03595c2c2 100644 --- a/erts/emulator/beam/erl_bif_re.c +++ b/erts/emulator/beam/erl_bif_re.c @@ -1042,6 +1042,7 @@ build_capture(Eterm capture_spec[CAPSPEC_SIZE], const pcre *code) (tmpbsiz = ap->len + 1)); } } + ASSERT(tmpb != NULL); sys_memcpy(tmpb,ap->name,ap->len); tmpb[ap->len] = '\0'; } else { @@ -1059,7 +1060,7 @@ build_capture(Eterm capture_spec[CAPSPEC_SIZE], const pcre *code) (tmpbsiz = slen + 1)); } } - + ASSERT(tmpb != NULL); buffres = erts_iolist_to_buf(val, tmpb, slen); ASSERT(buffres >= 0); (void)buffres; tmpb[slen] = '\0'; diff --git a/erts/emulator/beam/erl_bif_unique.c b/erts/emulator/beam/erl_bif_unique.c index 90820124f0..58aba0369b 100644 --- a/erts/emulator/beam/erl_bif_unique.c +++ b/erts/emulator/beam/erl_bif_unique.c @@ -813,6 +813,7 @@ bld_unique_integer_term(Eterm **hpp, Uint *szp, else { int hix; Eterm *hp = *hpp; + ASSERT(hp != NULL); tmp_hp = big_val(tmp); for (hix = 0; hix < hsz; hix++) hp[hix] = tmp_hp[hix]; diff --git a/erts/emulator/beam/erl_db.c b/erts/emulator/beam/erl_db.c index c80d987471..28e5a805bd 100644 --- a/erts/emulator/beam/erl_db.c +++ b/erts/emulator/beam/erl_db.c @@ -1512,6 +1512,7 @@ typedef struct { static ERTS_INLINE BIF_RETTYPE ets_cret_to_return_value(Process* p, int cret) { + ASSERT(p || cret == DB_ERROR_NONE_FALSE || cret == DB_ERROR_NONE); switch (cret) { case DB_ERROR_NONE_FALSE: BIF_RET(am_false); diff --git a/erts/emulator/beam/erl_db_catree.c b/erts/emulator/beam/erl_db_catree.c index 2e09c241dd..b5033abc68 100644 --- a/erts/emulator/beam/erl_db_catree.c +++ b/erts/emulator/beam/erl_db_catree.c @@ -370,6 +370,7 @@ TreeDbTerm* insert_TreeDbTerm(DbTableCATree *tb, p->balance = 0; (*this) = p1; } else { /* Double RR rotation */ + ASSERT(p1->right); p2 = p1->right; p1->right = p2->left; p2->left = p1; @@ -400,6 +401,7 @@ TreeDbTerm* insert_TreeDbTerm(DbTableCATree *tb, p->balance = 0; (*this) = p1; } else { /* Double RL rotation */ + ASSERT(p1->left); p2 = p1->left; p1->left = p2->right; p2->right = p1; @@ -465,8 +467,10 @@ static ERTS_INLINE int compute_tree_hight(TreeDbTerm * root) int hight_so_far = 1; while (current_node->left != NULL || current_node->right != NULL) { if (current_node->balance == -1) { + ASSERT(current_node->left != NULL); current_node = current_node->left; } else { + ASSERT(current_node->right != NULL); current_node = current_node->right; } hight_so_far = hight_so_far + 1; @@ -628,6 +632,7 @@ static TreeDbTerm* join_trees(TreeDbTerm *left_root_param, p->balance = 0; (*this) = p1; } else { /* Double RR rotation */ + ASSERT(p1->right); p2 = p1->right; p1->right = p2->left; p2->left = p1; @@ -658,6 +663,7 @@ static TreeDbTerm* join_trees(TreeDbTerm *left_root_param, p->balance = 0; (*this) = p1; } else { /* Double RL rotation */ + ASSERT(p1->left); p2 = p1->left; p1->left = p2->right; p2->right = p1; diff --git a/erts/emulator/beam/erl_db_tree.c b/erts/emulator/beam/erl_db_tree.c index 68afae1a7d..a439b974a7 100644 --- a/erts/emulator/beam/erl_db_tree.c +++ b/erts/emulator/beam/erl_db_tree.c @@ -757,6 +757,7 @@ int db_put_dbterm_tree_common(DbTableCommon *tb, p->balance = 0; (*this) = p1; } else { /* Double RR rotation */ + ASSERT(p1->right); p2 = p1->right; p1->right = p2->left; p2->left = p1; @@ -787,6 +788,7 @@ int db_put_dbterm_tree_common(DbTableCommon *tb, p->balance = 0; (*this) = p1; } else { /* Double RL rotation */ + ASSERT(p1->left); p2 = p1->left; p1->left = p2->right; p2->right = p1; @@ -878,6 +880,7 @@ int db_put_tree_common(DbTableCommon *tb, TreeDbTerm **root, Eterm obj, p->balance = 0; (*this) = p1; } else { /* Double RR rotation */ + ASSERT(p1->right); p2 = p1->right; p1->right = p2->left; p2->left = p1; @@ -908,6 +911,7 @@ int db_put_tree_common(DbTableCommon *tb, TreeDbTerm **root, Eterm obj, p->balance = 0; (*this) = p1; } else { /* Double RL rotation */ + ASSERT(p1->left); p2 = p1->left; p1->left = p2->right; p2->right = p1; diff --git a/erts/emulator/beam/erl_db_util.c b/erts/emulator/beam/erl_db_util.c index 1919436334..6cb123d55e 100644 --- a/erts/emulator/beam/erl_db_util.c +++ b/erts/emulator/beam/erl_db_util.c @@ -143,8 +143,6 @@ do { \ } while (0) -#define TermWords(t) (((t) / (sizeof(UWord)/sizeof(Eterm))) + !!((t) % (sizeof(UWord)/sizeof(Eterm)))) - #define add_dmc_err(EINFO, STR, VAR, TERM, SEV) \ vadd_dmc_err(EINFO, SEV, VAR, STR, TERM) @@ -2226,7 +2224,7 @@ restart: FAIL(); if (sys_memcmp(float_val(*ep) + 1, pc, sizeof(double))) FAIL(); - pc += TermWords(2); + pc += FLOAT_SIZE_OBJECT; ++ep; break; case matchEqRef: { @@ -2237,7 +2235,7 @@ restart: FAIL(); } i = thing_arityval(*epc); - pc += TermWords(i+1); + pc += i+1; ++ep; break; } @@ -2250,7 +2248,7 @@ restart: if (*tp != *epc) FAIL(); i = BIG_ARITY(epc); - pc += TermWords(i+1); + pc += i+1; while(i--) { if (*++tp != *++epc) { FAIL(); @@ -5323,8 +5321,10 @@ static Eterm match_spec_test(Process *p, Eterm against, Eterm spec, int trace) if (trace) { if (n) arr = erts_alloc(ERTS_ALC_T_DB_TMP, sizeof(Eterm) * n); - else + else { + ASSERT(!is_list(against)); arr = NULL; + } l = against; n = 0; while (is_list(l)) { @@ -5540,13 +5540,13 @@ void db_match_dis(Binary *bp) if (is_ordinary_ref_thing(t)) { ErtsORefThing *rt = (ErtsORefThing *) t; num = rt->num; - t += TermWords(ERTS_REF_THING_SIZE); + t += ERTS_REF_THING_SIZE; } else { ErtsMRefThing *mrt = (ErtsMRefThing *) t; ASSERT(is_magic_ref_thing(t)); num = mrt->mb->refn; - t += TermWords(ERTS_MAGIC_REF_THING_SIZE); + t += ERTS_MAGIC_REF_THING_SIZE; } erts_printf("EqRef\t(%d) {", (int) ERTS_REF_NUMBERS); @@ -5575,7 +5575,7 @@ void db_match_dis(Binary *bp) n = thing_arityval(*t); { Eterm *et = (Eterm *) t; - t += TermWords(n+1); + t += n+1; erts_printf("EqBig\t(%d) {", (int) n); first = 1; ++n; @@ -5599,7 +5599,7 @@ void db_match_dis(Binary *bp) { double num; sys_memcpy(&num,t,sizeof(double)); - t += TermWords(2); + t += FLOAT_SIZE_OBJECT; erts_printf("EqFloat\t%f\n", num); } break; diff --git a/erts/emulator/beam/erl_gc.c b/erts/emulator/beam/erl_gc.c index b9ae4c4161..7cdb532f75 100644 --- a/erts/emulator/beam/erl_gc.c +++ b/erts/emulator/beam/erl_gc.c @@ -2867,10 +2867,11 @@ sweep_off_heap(Process *p, int fullsweep) while (ptr) { if (IS_MOVED_BOXED(ptr->thing_word)) { ASSERT(!ErtsInArea(ptr, oheap, oheap_sz)); - if (is_external_header(((struct erl_off_heap_header*) boxed_val(ptr->thing_word))->thing_word)) + if (is_external_header(((struct erl_off_heap_header*) boxed_val(ptr->thing_word))->thing_word)) { erts_node_bookkeep(((ExternalThing*)ptr)->node, make_boxed(&ptr->thing_word), ERL_NODE_DEC, __FILE__, __LINE__); + } *prev = ptr = (struct erl_off_heap_header*) boxed_val(ptr->thing_word); ASSERT(!IS_MOVED_BOXED(ptr->thing_word)); switch (ptr->thing_word) { diff --git a/erts/emulator/beam/erl_lock_check.c b/erts/emulator/beam/erl_lock_check.c index 6613707e3f..a35bfe7a20 100644 --- a/erts/emulator/beam/erl_lock_check.c +++ b/erts/emulator/beam/erl_lock_check.c @@ -178,7 +178,7 @@ static erts_lc_lock_order_t erts_lock_order[] = { && \ ((LCK_FLG) & ERTS_LOCK_FLAGS_MASK_TYPE) != ERTS_LOCK_FLAGS_TYPE_SPINLOCK) -static __decl_noreturn void __noreturn lc_abort(void); +static __decl_noreturn void __noreturn lc_abort(void); static const char *rw_op_str(erts_lock_options_t options) { @@ -548,7 +548,7 @@ type_order_violation(char *op, lc_thread_t *thr, lc_abort(); } -static void +static void __noreturn lock_mismatch(lc_thread_t *thr, int exact, int failed_have, erts_lc_lock_t *have, int have_len, int failed_have_not, erts_lc_lock_t *have_not, int have_not_len) @@ -649,7 +649,7 @@ thread_exit_handler(void) } } -static __decl_noreturn void +static __decl_noreturn void __noreturn lc_abort(void) { #ifdef __WIN32__ @@ -689,7 +689,6 @@ erts_lc_assert_failed(const char *file, int line, const char *assertion) file, line, assertion); print_curr_locks(get_my_locked_locks()); lc_abort(); - return 0; } void erts_lc_fail(char *fmt, ...) @@ -1279,11 +1278,11 @@ void erts_lc_might_unlock_flg(erts_lc_lock_t *lck, erts_lock_options_t options) ll = thr->required.first; if (find_lock(&ll, lck)) unlock_of_required_lock(thr, lck); - } - ll = thr->locked.first; - if (!find_lock(&ll, lck)) - unlock_of_not_locked(thr, lck); + ll = thr->locked.first; + if (!find_lock(&ll, lck)) + unlock_of_not_locked(thr, lck); + } } int diff --git a/erts/emulator/beam/erl_lock_check.h b/erts/emulator/beam/erl_lock_check.h index b5b141bff6..92f056bee1 100644 --- a/erts/emulator/beam/erl_lock_check.h +++ b/erts/emulator/beam/erl_lock_check.h @@ -80,8 +80,8 @@ void erts_lc_might_unlock(erts_lc_lock_t *lck); void erts_lc_init_lock(erts_lc_lock_t *lck, char *name, erts_lock_flags_t flags); void erts_lc_init_lock_x(erts_lc_lock_t *lck, char *name, erts_lock_flags_t flags, Eterm extra); void erts_lc_destroy_lock(erts_lc_lock_t *lck); -void erts_lc_fail(char *fmt, ...); -int erts_lc_assert_failed(char *file, int line, char *assertion); +__decl_noreturn void __noreturn erts_lc_fail(char *fmt, ...); +__decl_noreturn int erts_lc_assert_failed(char *file, int line, char *assertion); void erts_lc_set_thread_name(char *thread_name); void erts_lc_pll(void); diff --git a/erts/emulator/beam/erl_map.c b/erts/emulator/beam/erl_map.c index e1650b9356..d82a4acfdf 100644 --- a/erts/emulator/beam/erl_map.c +++ b/erts/emulator/beam/erl_map.c @@ -919,6 +919,8 @@ static Eterm hashmap_from_chunked_array(ErtsHeapFactory *factory, hxnode_t *hxns *hp++ = MAP_HEADER_HAMT_NODE_BITMAP(hdr); *hp++ = res; sz--; + ASSERT(ESTACK_COUNT(stack) > sz); + while (sz--) { *hp++ = ESTACK_POP(stack); } res = make_hashmap(nhp); hdr = ESTACK_POP(stack); @@ -1304,6 +1306,7 @@ recurse: if (sp->nodeA == sp->nodeB) { res = sp->nodeA; ctx->size -= is_list(sp->nodeB) ? 1 : hashmap_subtree_size(sp->nodeB); + ASSERT(is_value(res)); } else { if (is_list(sp->nodeA)) { /* A is LEAF */ @@ -1319,6 +1322,7 @@ recurse: + Don't spend time comparing big values. - Might waste some heap space for internal nodes that could otherwise be reused. */ + ASSERT(is_value(res)); goto merge_nodes; } } @@ -2518,6 +2522,8 @@ unroll: return make_flatmap(mp); } + ASSERT(!ESTACK_ISEMPTY(stack)); + hp = HAlloc(p, size); hp_end = hp + size; res = THE_NON_VALUE; diff --git a/erts/emulator/beam/erl_message.h b/erts/emulator/beam/erl_message.h index 82d666923b..c63a1241d8 100644 --- a/erts/emulator/beam/erl_message.h +++ b/erts/emulator/beam/erl_message.h @@ -581,8 +581,8 @@ Uint erts_mbuf_size(Process *p); #define ERTS_FOREACH_SIG_PRIVQS(PROC, MVAR, CODE) \ do { \ int i__; \ - ErtsMessage *msgs__[] = {(PROC)->sig_qs.first, \ - (PROC)->sig_qs.cont}; \ + ErtsMessage *msgs__[2] = {(PROC)->sig_qs.first, \ + (PROC)->sig_qs.cont}; \ for (i__ = 0; i__ < sizeof(msgs__)/sizeof(msgs__[0]); i__++) { \ ErtsMessage *MVAR; \ for (MVAR = msgs__[i__]; MVAR; MVAR = MVAR->next) { \ diff --git a/erts/emulator/beam/erl_msacc.h b/erts/emulator/beam/erl_msacc.h index b2b5be49e2..d348e05c84 100644 --- a/erts/emulator/beam/erl_msacc.h +++ b/erts/emulator/beam/erl_msacc.h @@ -370,47 +370,47 @@ void erts_msacc_set_state_m__(ErtsMsAcc *msacc, Uint new_state, int increment) { #else #define ERTS_MSACC_IS_ENABLED() 0 -#define erts_msacc_early_init() -#define erts_msacc_init() -#define erts_msacc_init_thread(type, id, liberty) -#define ERTS_MSACC_PUSH_STATE() -#define ERTS_MSACC_PUSH_STATE_CACHED() -#define ERTS_MSACC_POP_STATE() -#define ERTS_MSACC_SET_STATE(state) -#define ERTS_MSACC_SET_STATE_CACHED(state) -#define ERTS_MSACC_PUSH_AND_SET_STATE(state) -#define ERTS_MSACC_PUSH_AND_SET_STATE_CACHED(state) -#define ERTS_MSACC_UPDATE_CACHE() -#define ERTS_MSACC_IS_ENABLED_CACHED() -#define ERTS_MSACC_DECLARE_CACHE() -#define ERTS_MSACC_PUSH_STATE_M() -#define ERTS_MSACC_PUSH_STATE_CACHED_M() -#define ERTS_MSACC_SET_STATE_CACHED_M(state) -#define ERTS_MSACC_POP_STATE_M() -#define ERTS_MSACC_PUSH_AND_SET_STATE_M(state) -#define ERTS_MSACC_SET_BIF_STATE_CACHED_X(Mod,Addr) +#define erts_msacc_early_init() do {} while(0) +#define erts_msacc_init() do {} while(0) +#define erts_msacc_init_thread(type, id, liberty) do {} while(0) +#define ERTS_MSACC_PUSH_STATE() do {} while(0) +#define ERTS_MSACC_PUSH_STATE_CACHED() do {} while(0) +#define ERTS_MSACC_POP_STATE() do {} while(0) +#define ERTS_MSACC_SET_STATE(state) do {} while(0) +#define ERTS_MSACC_SET_STATE_CACHED(state) do {} while(0) +#define ERTS_MSACC_PUSH_AND_SET_STATE(state) do {} while(0) +#define ERTS_MSACC_PUSH_AND_SET_STATE_CACHED(state) do {} while(0) +#define ERTS_MSACC_UPDATE_CACHE() do {} while(0) +#define ERTS_MSACC_IS_ENABLED_CACHED() do {} while(0) +#define ERTS_MSACC_DECLARE_CACHE() +#define ERTS_MSACC_PUSH_STATE_M() do {} while(0) +#define ERTS_MSACC_PUSH_STATE_CACHED_M() do {} while(0) +#define ERTS_MSACC_SET_STATE_CACHED_M(state) do {} while(0) +#define ERTS_MSACC_POP_STATE_M() do {} while(0) +#define ERTS_MSACC_PUSH_AND_SET_STATE_M(state) do {} while(0) +#define ERTS_MSACC_SET_BIF_STATE_CACHED_X(Mod,Addr) do {} while(0) #endif /* ERTS_ENABLE_MSACC */ #ifndef ERTS_MSACC_EXTENDED_STATES -#define ERTS_MSACC_PUSH_STATE_X() -#define ERTS_MSACC_POP_STATE_X() -#define ERTS_MSACC_SET_STATE_X(state) -#define ERTS_MSACC_SET_STATE_M_X(state) -#define ERTS_MSACC_SET_STATE_CACHED_X(state) -#define ERTS_MSACC_PUSH_AND_SET_STATE_X(state) -#define ERTS_MSACC_PUSH_AND_SET_STATE_CACHED_X(state) -#define ERTS_MSACC_UPDATE_CACHE_X() +#define ERTS_MSACC_PUSH_STATE_X() do {} while(0) +#define ERTS_MSACC_POP_STATE_X() do {} while(0) +#define ERTS_MSACC_SET_STATE_X(state) do {} while(0) +#define ERTS_MSACC_SET_STATE_M_X(state) do {} while(0) +#define ERTS_MSACC_SET_STATE_CACHED_X(state) do {} while(0) +#define ERTS_MSACC_PUSH_AND_SET_STATE_X(state) do {} while(0) +#define ERTS_MSACC_PUSH_AND_SET_STATE_CACHED_X(state) do {} while(0) +#define ERTS_MSACC_UPDATE_CACHE_X() do {} while(0) #define ERTS_MSACC_IS_ENABLED_CACHED_X() 0 #define ERTS_MSACC_DECLARE_CACHE_X() -#define ERTS_MSACC_PUSH_STATE_M_X() -#define ERTS_MSACC_PUSH_STATE_CACHED_M_X() +#define ERTS_MSACC_PUSH_STATE_M_X() do {} while(0) +#define ERTS_MSACC_PUSH_STATE_CACHED_M_X() do {} while(0) #define ERTS_MSACC_SET_STATE_CACHED_M_X(state) -#define ERTS_MSACC_POP_STATE_M_X() -#define ERTS_MSACC_PUSH_AND_SET_STATE_M_X(state) -#define ERTS_MSACC_PUSH_AND_SET_STATE_CACHED_M_X(state) -#define ERTS_MSACC_SET_BIF_STATE_CACHED_X(Mod,Addr) +#define ERTS_MSACC_POP_STATE_M_X() do {} while(0) +#define ERTS_MSACC_PUSH_AND_SET_STATE_M_X(state) do {} while(0) +#define ERTS_MSACC_PUSH_AND_SET_STATE_CACHED_M_X(state) do {} while(0) +#define ERTS_MSACC_SET_BIF_STATE_CACHED_X(Mod,Addr) do {} while(0) #else diff --git a/erts/emulator/beam/erl_process.c b/erts/emulator/beam/erl_process.c index afb9fa1f55..99f1becec2 100644 --- a/erts/emulator/beam/erl_process.c +++ b/erts/emulator/beam/erl_process.c @@ -5283,6 +5283,7 @@ change_no_used_runqs(int used) { ErtsMigrationPaths *new_mpaths, *old_mpaths; int qix; + ASSERT(used > 0); erts_mtx_lock(&balance_info.update_mtx); set_no_used_runqs(used); diff --git a/erts/emulator/beam/erl_process_lock.c b/erts/emulator/beam/erl_process_lock.c index 04fb81eb35..2e422f6f68 100644 --- a/erts/emulator/beam/erl_process_lock.c +++ b/erts/emulator/beam/erl_process_lock.c @@ -307,10 +307,10 @@ transfer_locks(Process *p, & (lock << ERTS_PROC_LOCK_WAITER_SHIFT)); transferred++; wtr = dequeue_waiter(&p->lock, lock_no); - ERTS_LC_ASSERT(wtr); + ASSERT(wtr != NULL); if (!p->lock.queue[lock_no]) unset_waiter |= lock; - ERTS_LC_ASSERT(wtr->uflgs & lock); + ASSERT(wtr->uflgs & lock); wtr->uflgs &= ~lock; if (wtr->uflgs) try_aquire(&p->lock, wtr); diff --git a/erts/emulator/beam/erl_trace.c b/erts/emulator/beam/erl_trace.c index c1a1aba1f3..904013a8f5 100644 --- a/erts/emulator/beam/erl_trace.c +++ b/erts/emulator/beam/erl_trace.c @@ -2861,6 +2861,8 @@ is_tracer_enabled(Process* c_p, ErtsProcLocks c_p_locks, enum ErtsTracerOpt topt, Eterm tag) { Eterm nif_result; + ASSERT(t_p); + #if defined(ERTS_ENABLE_LOCK_CHECK) if (c_p) ERTS_LC_ASSERT(erts_proc_lc_my_proc_locks(c_p) == c_p_locks diff --git a/erts/emulator/beam/external.c b/erts/emulator/beam/external.c index f66ac8c28f..7d1f8e2857 100644 --- a/erts/emulator/beam/external.c +++ b/erts/emulator/beam/external.c @@ -3059,6 +3059,9 @@ enc_term_int(TTBEncodeContext* ctx, ErtsAtomCacheMap *acmp, Eterm obj, byte* ep, } } + /* If pending connect there must be a context and an iov within that context */ + ASSERT(!(dflags & DFLAG_PENDING_CONNECT) || (ctx && ctx->iov)); + goto L_jump_start; outer_loop: @@ -3577,7 +3581,6 @@ enc_term_int(TTBEncodeContext* ctx, ErtsAtomCacheMap *acmp, Eterm obj, byte* ep, case EXPORT_DEF: { Export* exp = *((Export **) (export_val(obj) + 1)); - ASSERT(!(dflags & DFLAG_PENDING_CONNECT) || (ctx && ctx->iov)); if (dflags & DFLAG_PENDING_CONNECT) hopefull_export(ctx, &ep, exp, dflags, off_heap); else if ((dflags & DFLAG_EXPORT_PTR_TAG) != 0) { @@ -4978,6 +4981,9 @@ encode_size_struct_int(TTBSizeContext* ctx, ErtsAtomCacheMap *acmp, Eterm obj, } } + /* If pending connect there must be a context and an iov within that context */ + ASSERT(!(dflags & DFLAG_PENDING_CONNECT) || ctx); + #define LIST_TAIL_OP ((0 << _TAG_PRIMARY_SIZE) | TAG_PRIMARY_HEADER) #define PATCH_FUN_SIZE_OP ((1 << _TAG_PRIMARY_SIZE) | TAG_PRIMARY_HEADER) #define TERM_ARRAY_OP(N) (((N+1) << _TAG_PRIMARY_SIZE) | TAG_PRIMARY_HEADER) diff --git a/erts/emulator/beam/global.h b/erts/emulator/beam/global.h index a76c61424a..133e1cfa51 100644 --- a/erts/emulator/beam/global.h +++ b/erts/emulator/beam/global.h @@ -464,7 +464,7 @@ do { \ #define ESTACK_COUNT(s) ((s).sp - (s).start) #define ESTACK_ISEMPTY(s) ((s).sp == (s).start) -#define ESTACK_POP(s) (*(--(s).sp)) +#define ESTACK_POP(s) (ASSERT(!ESTACK_ISEMPTY(s)),(*(--(s).sp))) /* diff --git a/erts/emulator/beam/io.c b/erts/emulator/beam/io.c index 7d71e3d0ff..1468e35449 100644 --- a/erts/emulator/beam/io.c +++ b/erts/emulator/beam/io.c @@ -3063,6 +3063,7 @@ static void resize_linebuf(LineBuf **b) */ static int flush_linebuf(LineBufContext *bp) { + ASSERT(*bp->b != NULL); bp->retlen = (*bp->b)->ovlen; switch(LINEBUF_STATE(*bp)){ case LINEBUF_CR_INSIDE: diff --git a/erts/emulator/drivers/common/inet_drv.c b/erts/emulator/drivers/common/inet_drv.c index 3334152738..967958e9ff 100644 --- a/erts/emulator/drivers/common/inet_drv.c +++ b/erts/emulator/drivers/common/inet_drv.c @@ -5348,13 +5348,17 @@ static int call_getifaddrs(inet_descriptor* desc_p, struct ifaddrs **ifa_pp) * over the getifaddrs() call */ current_ns = open("/proc/self/ns/net", O_RDONLY); - if (current_ns == INVALID_SOCKET) - return sock_errno(); + if (current_ns == INVALID_SOCKET) { + save_errno = sock_errno(); + ASSERT(save_errno != 0); + return save_errno; + } new_ns = open(desc_p->netns, O_RDONLY); if (new_ns == INVALID_SOCKET) { save_errno = sock_errno(); while (close(current_ns) == INVALID_SOCKET && sock_errno() == EINTR); + ASSERT(save_errno != 0); return save_errno; } if (setns(new_ns, CLONE_NEWNET) != 0) { @@ -5363,6 +5367,7 @@ static int call_getifaddrs(inet_descriptor* desc_p, struct ifaddrs **ifa_pp) sock_errno() == EINTR); while (close(current_ns) == INVALID_SOCKET && sock_errno() == EINTR); + ASSERT(save_errno != 0); return save_errno; } else { @@ -5387,6 +5392,7 @@ static int call_getifaddrs(inet_descriptor* desc_p, struct ifaddrs **ifa_pp) if (result >= 0) { /* We got a result but have to waste it */ save_errno = sock_errno(); + ASSERT(save_errno != 0); freeifaddrs(*ifa_pp); } } diff --git a/erts/emulator/drivers/unix/ttsl_drv.c b/erts/emulator/drivers/unix/ttsl_drv.c index 05bec288d4..fec38df024 100644 --- a/erts/emulator/drivers/unix/ttsl_drv.c +++ b/erts/emulator/drivers/unix/ttsl_drv.c @@ -609,6 +609,7 @@ static void octal_or_hex_format(Uint ch, byte *buf, int *pos) 'A','B','C','D','E','F'}; int num = octal_or_hex_positions(ch); if (num != 3) { + ASSERT(num > 3); buf[(*pos)++] = 'x'; buf[(*pos)++] = '{'; num -= 3; diff --git a/erts/emulator/sys/common/erl_check_io.c b/erts/emulator/sys/common/erl_check_io.c index e9091ec771..9d6be82445 100644 --- a/erts/emulator/sys/common/erl_check_io.c +++ b/erts/emulator/sys/common/erl_check_io.c @@ -2623,7 +2623,7 @@ static int erts_debug_print_checkio_state(erts_dsprintf_buf_t *dsbufp, if (state->type == ERTS_EV_TYPE_DRV_SEL) { erts_dsprintf(dsbufp, "driver_select "); - + ASSERT(state->driver.select != NULL); #ifdef ERTS_SYS_CONTINOUS_FD_NUMBERS if (internal) { erts_dsprintf(dsbufp, "internal "); @@ -2698,6 +2698,7 @@ static int erts_debug_print_checkio_state(erts_dsprintf_buf_t *dsbufp, } else if (state->type == ERTS_EV_TYPE_NIF) { ErtsResource* r; + ASSERT(state->driver.nif != NULL); erts_dsprintf(dsbufp, "enif_select "); #ifdef ERTS_SYS_CONTINOUS_FD_NUMBERS @@ -2823,6 +2824,7 @@ erts_check_io_debug(ErtsCheckIoDebugInfo *ciodip) null_des.driver.nif = NULL; null_des.driver.stop.drv_ptr = NULL; null_des.events = 0; + null_des.active_events = 0; null_des.type = ERTS_EV_TYPE_NONE; null_des.flags = 0; diff --git a/erts/emulator/sys/common/erl_mmap.c b/erts/emulator/sys/common/erl_mmap.c index bb09590b1b..890adbb7cb 100644 --- a/erts/emulator/sys/common/erl_mmap.c +++ b/erts/emulator/sys/common/erl_mmap.c @@ -1835,7 +1835,7 @@ void * erts_mremap(ErtsMemMapper* mm, Uint32 flags, void *ptr, UWord old_size, UWord *sizep) { - void *new_ptr; + void *new_ptr = NULL; Uint32 superaligned; UWord asize; @@ -1895,9 +1895,9 @@ erts_mremap(ErtsMemMapper* mm, } #endif #ifdef ERTS_HAVE_OS_MREMAP - if (superaligned) + if (superaligned) { return remap_move(mm, flags, new_ptr, old_size, sizep); - else { + } else { new_ptr = os_mremap(ptr, old_size, asize, 0); if (!new_ptr) return NULL; diff --git a/erts/emulator/sys/common/erl_poll.c b/erts/emulator/sys/common/erl_poll.c index 9f0c82dc4b..d2c808a5a9 100644 --- a/erts/emulator/sys/common/erl_poll.c +++ b/erts/emulator/sys/common/erl_poll.c @@ -219,12 +219,12 @@ int ERTS_SELECT(int nfds, ERTS_fd_set *readfds, ERTS_fd_set *writefds, #else -#define ERTS_POLLSET_SET_HAVE_UPDATE_REQUESTS(PS) -#define ERTS_POLLSET_UNSET_HAVE_UPDATE_REQUESTS(PS) +#define ERTS_POLLSET_SET_HAVE_UPDATE_REQUESTS(PS) do {} while(0) +#define ERTS_POLLSET_UNSET_HAVE_UPDATE_REQUESTS(PS) do {} while(0) #define ERTS_POLLSET_HAVE_UPDATE_REQUESTS(PS) 0 -#define ERTS_POLLSET_LOCK(PS) -#define ERTS_POLLSET_UNLOCK(PS) +#define ERTS_POLLSET_LOCK(PS) do {} while(0) +#define ERTS_POLLSET_UNLOCK(PS) do {} while(0) #endif @@ -1154,6 +1154,8 @@ static int update_pollset(ErtsPollSet *ps, ErtsPollResFd pr[], int fd) int last_pix; if (reset) { + /* pr is only null during poll initialization and then no reset should happen */ + ASSERT(pr != NULL); /* When a fd has been reset, we tell the caller of erts_poll_wait this by setting the fd as ERTS_POLL_EV_NONE */ ERTS_POLL_RES_SET_FD(&pr[res], fd); diff --git a/erts/emulator/sys/unix/sys.c b/erts/emulator/sys/unix/sys.c index 4fc10cc4f3..7ddfed7d25 100644 --- a/erts/emulator/sys/unix/sys.c +++ b/erts/emulator/sys/unix/sys.c @@ -924,7 +924,7 @@ void sys_preload_end(Preload* p) */ int sys_get_key(int fd) { int c, ret; - unsigned char rbuf[64]; + unsigned char rbuf[64] = {0}; fd_set fds; fflush(stdout); /* Flush query ??? */ diff --git a/erts/epmd/src/epmd_int.h b/erts/epmd/src/epmd_int.h index f5d17aff55..e09dd0ac95 100644 --- a/erts/epmd/src/epmd_int.h +++ b/erts/epmd/src/epmd_int.h @@ -97,6 +97,12 @@ # include <systemd/sd-daemon.h> #endif /* HAVE_SYSTEMD_DAEMON */ +#ifdef DEBUG +#define ASSERT(Cnd) do { if (!(Cnd)) { abort(); } } while(0) +#else +#define ASSERT(Cnd) +#endif + #if defined(HAVE_IN6) && defined(AF_INET6) && defined(HAVE_INET_PTON) # define EPMD6 #endif diff --git a/erts/epmd/src/epmd_srv.c b/erts/epmd/src/epmd_srv.c index ad264585c6..f8fbc45cd2 100644 --- a/erts/epmd/src/epmd_srv.c +++ b/erts/epmd/src/epmd_srv.c @@ -1434,6 +1434,7 @@ static Node *node_reg2(EpmdVars *g, (g->debug && (g->nodes.unreg_count > DEBUG_MAX_UNREG_COUNT))) { /* MAX_UNREG_COUNT > 1 so no need to check unreg_tail */ + ASSERT(g->nodes.unreg != NULL); node = g->nodes.unreg; /* Take first == oldest */ g->nodes.unreg = node->next; /* Link out */ g->nodes.unreg_count--; diff --git a/erts/etc/common/heart.c b/erts/etc/common/heart.c index 215c152008..db4e2cfd24 100644 --- a/erts/etc/common/heart.c +++ b/erts/etc/common/heart.c @@ -283,8 +283,8 @@ free_env_val(char *value) */ static void get_arguments(int argc, char** argv) { int i = 1; - int h; - unsigned long p; + int h = -1; + unsigned long p = 0; while (i < argc) { switch (argv[i][0]) { diff --git a/erts/etc/common/inet_gethost.c b/erts/etc/common/inet_gethost.c index 12012a056e..3814cc3387 100644 --- a/erts/etc/common/inet_gethost.c +++ b/erts/etc/common/inet_gethost.c @@ -117,6 +117,17 @@ #endif /* !WIN32 */ +#if defined(__GNUC__) +# define PROTO_NORETURN__ void __attribute__((noreturn)) +# define IMPL_NORETURN__ void +#elif defined(__WIN32__) && defined(_MSC_VER) +# define PROTO_NORETURN__ __declspec(noreturn) void +# define IMPL_NORETURN__ __declspec(noreturn) void +#else +# define PROTO_NORETURN__ void +# define IMPL_NORETURN__ void +#endif + #define PACKET_BYTES 4 #ifdef WIN32 #define READ_PACKET_BYTES(X,Y,Z) read_int32((X),(Y),(Z)) @@ -298,6 +309,12 @@ static HANDLE debug_console_allocated = INVALID_HANDLE_VALUE; #define REALLOC(Old, Size) my_realloc((Old), (Size)) #define FREE(Ptr) free(Ptr) +#ifdef DEBUG +#define ASSERT(Cnd) do { if (!(Cnd)) { abort(); } } while(0) +#else +#define ASSERT(Cnd) +#endif + #ifdef WIN32 #define WAKEUP_WINSOCK() do { \ char dummy_buff[100]; \ @@ -309,7 +326,7 @@ static HANDLE debug_console_allocated = INVALID_HANDLE_VALUE; static char *format_address(int siz, AddrByte *addr); static void debugf(char *format, ...); static void warning(char *format, ...); -static void fatal(char *format, ...); +static PROTO_NORETURN__ fatal(char *format, ...); static void *my_malloc(size_t size); static void *my_realloc(void *old, size_t size); static int get_int32(AddrByte *buff); @@ -1721,6 +1738,7 @@ static int worker_loop(void) req = REALLOC(req, (req_size = this_size)); } } + ASSERT(req != NULL); if (read_exact(0, req, (size_t) this_size) != this_size) { DEBUGF(1,("Worker got EOF while reading data, exiting.")); exit(0); @@ -2120,6 +2138,7 @@ static size_t build_reply(SerialType serial, struct hostent *he, (*preply_size = need)); } } + ASSERT(*preply != NULL); ptr = *preply; PUT_PACKET_BYTES(ptr,need - PACKET_BYTES); ptr += PACKET_BYTES; @@ -2179,7 +2198,7 @@ static size_t build_reply_ai(SerialType serial, int addrlen, (*preply_size = need)); } } - + ASSERT(*preply != NULL); ptr = *preply; PUT_PACKET_BYTES(ptr,need - PACKET_BYTES); ptr += PACKET_BYTES; @@ -2592,7 +2611,7 @@ static void warning(char *format, ...) va_end(ap); } -static void fatal(char *format, ...) +static IMPL_NORETURN__ fatal(char *format, ...) { char buff[2048]; char *ptr; diff --git a/erts/include/internal/ethread.h b/erts/include/internal/ethread.h index 83c66f381d..23f9517244 100644 --- a/erts/include/internal/ethread.h +++ b/erts/include/internal/ethread.h @@ -83,14 +83,6 @@ # endif #endif -int ethr_assert_failed(const char *file, int line, const char *func, char *a); -#ifdef ETHR_DEBUG -#define ETHR_ASSERT(A) \ - ((void) ((A) ? 1 : ethr_assert_failed(__FILE__, __LINE__, __func__, #A))) -#else -#define ETHR_ASSERT(A) ((void) 1) -#endif - #if defined(__GNUC__) # define ETHR_PROTO_NORETURN__ void __attribute__((noreturn)) # define ETHR_IMPL_NORETURN__ void @@ -102,6 +94,16 @@ int ethr_assert_failed(const char *file, int line, const char *func, char *a); # define ETHR_IMPL_NORETURN__ void #endif +ETHR_PROTO_NORETURN__ +ethr_assert_failed(const char *file, int line, const char *func, char *a); +#ifdef ETHR_DEBUG +#define ETHR_ASSERT(A) \ + ((void) ((A) ? 1 : ethr_assert_failed(__FILE__, __LINE__, __func__, #A))) +#else +#define ETHR_ASSERT(A) ((void) 1) +#endif + + #if defined(ETHR_PTHREADS) /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\ * The pthread implementation * diff --git a/erts/lib_src/common/ethr_aux.c b/erts/lib_src/common/ethr_aux.c index c24f262e9c..ea860fa568 100644 --- a/erts/lib_src/common/ethr_aux.c +++ b/erts/lib_src/common/ethr_aux.c @@ -751,9 +751,9 @@ ETHR_IMPL_NORETURN__ ethr_fatal_error__(const char *file, ethr_abort__(); } -int ethr_assert_failed(const char *file, int line, const char *func, char *a) +ETHR_IMPL_NORETURN__ +ethr_assert_failed(const char *file, int line, const char *func, char *a) { fprintf(stderr, "%s:%d: %s(): Assertion failed: %s\n", file, line, func, a); ethr_abort__(); - return 0; } diff --git a/erts/lib_src/common/ethr_mutex.c b/erts/lib_src/common/ethr_mutex.c index 7be83b9117..acc7cb2da2 100644 --- a/erts/lib_src/common/ethr_mutex.c +++ b/erts/lib_src/common/ethr_mutex.c @@ -1058,7 +1058,7 @@ ethr_cond_signal(ethr_cond *cnd) ethr_ts_event *tse; ETHR_ASSERT(!ethr_not_inited__); - ETHR_ASSERT(cnd); + ETHR_ASSERT(cnd != NULL); ETHR_ASSERT(cnd->initialized == ETHR_COND_INITIALIZED); ETHR_MTX_HARD_DEBUG_FENCE_CHK(cnd); diff --git a/erts/lib_src/yielding_c_fun/ycf_yield_fun.c b/erts/lib_src/yielding_c_fun/ycf_yield_fun.c index a597df87c0..9fedac2b79 100644 --- a/erts/lib_src/yielding_c_fun/ycf_yield_fun.c +++ b/erts/lib_src/yielding_c_fun/ycf_yield_fun.c @@ -135,7 +135,7 @@ ycf_node* mk_yield_code(ycf_node* f_node, ycf_symbol_list ret_type = ycf_node_get_return_type(f_node); ret_code = ycf_string_new(" {\n" - " static %s const ycf_unused_ret_value;\n" + " static %s const ycf_unused_ret_value = 0;\n" " return ycf_unused_ret_value;\n" " }\n", ycf_symbol_list_to_str(&ret_type)); -- 2.26.2
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor