From d5104b917ecbe5ed8f1e41b3dfe6fa49499b0b60 Mon Sep 17 00:00:00 2001 From: Hans Pabst Date: Fri, 13 Jun 2025 15:30:08 +0200 Subject: [PATCH] Fixed data races and undefined behavior - Assert presence of certain arguments. - Fixed potential data races (Helgrind). - Avoid undefined behavior (UBSan). Minor (qs_harmonics_atom.F): - reduced memory consumption. --- src/aobasis/ai_oneelectron.F | 2 ++ src/commutator_rpnl.F | 6 +++--- src/core_ae.F | 4 ++-- src/core_ppl.F | 4 ++-- src/core_ppnl.F | 2 +- src/dbm/dbm_matrix.c | 4 +++- src/dbm/dbm_shard.c | 6 ++++-- src/qs_harmonics_atom.F | 12 +++--------- src/qs_kinetic.F | 2 +- src/qs_ks_atom.F | 2 +- src/qs_overlap.F | 2 +- src/qs_vcd_ao.F | 10 +++++----- src/rt_propagation_velocity_gauge.F | 2 +- 13 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/aobasis/ai_oneelectron.F b/src/aobasis/ai_oneelectron.F index d2caa4154b..6c817a6670 100644 --- a/src/aobasis/ai_oneelectron.F +++ b/src/aobasis/ai_oneelectron.F @@ -547,6 +547,8 @@ CONTAINS END DO END DO + CPASSERT(PRESENT(iatom) .AND. PRESENT(jatom) .AND. PRESENT(katom)) + CPASSERT(PRESENT(deltaR)) DO idir = 1, 3 DO j = ncoset(lb_min_set - 1) + 1, ncoset(lb_max_set) DO i = ncoset(la_min_set - 1) + 1, ncoset(la_max_set) diff --git a/src/commutator_rpnl.F b/src/commutator_rpnl.F index f9c43d9d09..28aa47fc84 100644 --- a/src/commutator_rpnl.F +++ b/src/commutator_rpnl.F @@ -582,7 +582,7 @@ CONTAINS !$OMP matrix_r_rxvr, matrix_rxvr_r, my_r_rxvr, my_rxvr_r, & !$OMP pseudoatom, do_symmetric) & !$OMP PRIVATE (ikind, jkind, iatom, jatom, cell_b, rab, & -!$OMP iab, irow, icol, & +!$OMP iab, irow, icol, lock_num, & !$OMP blocks_rv, blocks_rxrv, blocks_rrv, blocks_rvr, blocks_rrv_vrr, & !$OMP blocks_r_rxvr, blocks_rxvr_r, blocks_r_doublecom, & !$OMP found, iac, ibc, alist_ac, alist_bc, & @@ -1619,7 +1619,7 @@ CONTAINS !$OMP DEFAULT (NONE) & !$OMP SHARED (basis_set, matrix_mag_nl, sap_int, natom, nkind, eps_ppnl, locks, sab_all, & !$OMP particle_set, my_ref, refpoint) & -!$OMP PRIVATE (ikind, jkind, iatom, jatom, cell_b, rab, & +!$OMP PRIVATE (ikind, jkind, iatom, jatom, cell_b, rab, lock_num, & !$OMP iab, irow, icol, blocks_mag, r_ps, r_b, go, hash, & !$OMP found, iac, ibc, alist_ac, alist_bc, acint, bcint, & !$OMP achint, bchint, na, np, nb, kkind, kac, kbc) @@ -1870,7 +1870,7 @@ CONTAINS !$OMP PRIVATE (ikind, jkind, iatom, jatom, cell_b, rab, & !$OMP iab, irow, icol, blocks_rv, & !$OMP found, iac, ibc, alist_ac, alist_bc, & -!$OMP na, np, nb, kkind, kac, kbc, i, & +!$OMP na, np, nb, kkind, kac, kbc, i, lock_num, & !$OMP hash, natom, delta, gamma, achint, bchint, acint, bcint) !$OMP SINGLE diff --git a/src/core_ae.F b/src/core_ae.F index e7b075a74d..dc6e826083 100644 --- a/src/core_ae.F +++ b/src/core_ae.F @@ -195,7 +195,7 @@ CONTAINS !$OMP sab_orb, sac_ae, nthread, ncoset, nkind, cell_to_index, & !$OMP slot, ldsab, maxnset, ldai, nder, maxl, maxco, dokp, doat, locks, natom) & !$OMP PRIVATE (ikind, jkind, iatom, jatom, rab, basis_set_a, basis_set_b, & -!$OMP first_sgfa, la_max, la_min, npgfa, nsgfa, sphi_a, & +!$OMP first_sgfa, la_max, la_min, npgfa, nsgfa, sphi_a, lock_num, & !$OMP zeta, first_sgfb, lb_max, lb_min, npgfb, nsetb, rpgfb, set_radius_b, sphi_b, & !$OMP zetb, zeta_c, alpha_c, core_charge, dab, irow, icol, h_block, found, iset, ncoa, & !$OMP sgfa, jset, ncob, sgfb, nsgfb, p_block, work, pab, hab, kkind, nseta, & @@ -700,7 +700,7 @@ CONTAINS !$OMP sab_orb, sac_ae, nthread, ncoset, nkind, calpha, ccore, eps_core_charge, & !$OMP slot, ldsab, maxnset, ldai, maxl, maxco, doat, locks, natom) & !$OMP PRIVATE (ikind, jkind, iatom, jatom, rab, basis_set_a, basis_set_b, & -!$OMP first_sgfa, la_max, la_min, npgfa, nsgfa, sphi_a, & +!$OMP first_sgfa, la_max, la_min, npgfa, nsgfa, sphi_a, lock_num, & !$OMP zeta, first_sgfb, lb_max, lb_min, npgfb, nsetb, rpgfb, set_radius_b, sphi_b, & !$OMP zetb, zeta_c, alpha_c, core_charge, dab, irow, icol, h_block, found, iset, ncoa, & !$OMP sgfa, jset, ncob, sgfb, nsgfb, p_block, work, pab, hab, kkind, nseta, & diff --git a/src/core_ppl.F b/src/core_ppl.F index f161de2bf9..2ea6d34757 100644 --- a/src/core_ppl.F +++ b/src/core_ppl.F @@ -241,7 +241,7 @@ CONTAINS !$OMP PRIVATE (ikind, jkind, iatom, jatom, rab, basis_set_a, basis_set_b, & !$OMP first_sgfa, la_max, la_min, npgfa, nsgfa, sphi_a, & !$OMP zeta, first_sgfb, lb_max, lb_min, npgfb, nsetb, rpgfb, set_radius_b, sphi_b, & -!$OMP zetb, dab, irow, icol, h_block, found, iset, ncoa, & +!$OMP zetb, dab, irow, icol, h_block, found, iset, ncoa, lock_num, & !$OMP sgfa, jset, ncob, sgfb, nsgfb, p_block, work, pab, hab, hab2, hab2_w, & !$OMP atk0, atk1, h1_1block, h1_2block, h1_3block, kkind, nseta, & !$OMP gth_potential, sgp_potential, alpha, cexp_ppl, lpotextended, & @@ -856,7 +856,7 @@ CONTAINS !$OMP SHARED (maxco,maxsgf,basis_set_list,calculate_forces,lri_ppl_coef,qs_kind_set,& !$OMP locks,natom,use_virial,virial,ncoset,atom_of_kind,sac_ppl) & !$OMP PRIVATE (ikind,kkind,iatom,katom,atom_a,rac,va,dva,dvas,basis_set,slot,& -!$OMP first_sgfa,la_max,la_min,npgfa,nseta,nsgfa,rpgfa,set_radius_a,& +!$OMP first_sgfa,la_max,la_min,npgfa,nseta,nsgfa,rpgfa,set_radius_a,lock_num,& !$OMP sphi_a,zeta,gth_potential,sgp_potential,alpha,cexp_ppl,lpotextended,ppl_radius,& !$OMP nexp_ppl,alpha_ppl,nct_ppl,cval_ppl,nloc,n_local,nrloc,a_local,aloc,bloc,c_local,nfun,work,& !$OMP hash,dac,force_a,iset,sgfa,sgfb,ncoa,bcon,cval_lpot,nct_lpot,alpha_lpot,nexp_lpot,& diff --git a/src/core_ppnl.F b/src/core_ppnl.F index 9880aa0100..1e6593be42 100644 --- a/src/core_ppnl.F +++ b/src/core_ppnl.F @@ -495,7 +495,7 @@ CONTAINS !$OMP locks, virial, use_virial, calculate_forces, do_soc, natom) & !$OMP PRIVATE (ikind, jkind, iatom, jatom, cell_b, rab, & !$OMP slot, iab, atom_a, f0, irow, icol, h_block, & -!$OMP l_block_x, l_block_y, l_block_z, & +!$OMP l_block_x, l_block_y, l_block_z, lock_num, & !$OMP r_2block, r_3block, atk, & !$OMP found,p_block, iac, ibc, alist_ac, alist_bc, acint, bcint, & !$OMP achint, bchint, alkint, blkint, & diff --git a/src/dbm/dbm_matrix.c b/src/dbm/dbm_matrix.c index 0afdb88e56..b2b60cf666 100644 --- a/src/dbm/dbm_matrix.c +++ b/src/dbm/dbm_matrix.c @@ -390,7 +390,9 @@ void dbm_zero(dbm_matrix_t *matrix) { #pragma omp parallel for DBM_OMP_SCHEDULE for (int ishard = 0; ishard < dbm_get_num_shards(matrix); ishard++) { dbm_shard_t *shard = &matrix->shards[ishard]; - memset(shard->data, 0, shard->data_size * sizeof(double)); + if (shard->data != NULL) { + memset(shard->data, 0, shard->data_size * sizeof(double)); + } } } diff --git a/src/dbm/dbm_shard.c b/src/dbm/dbm_shard.c index 85532d8f54..c4283600d6 100644 --- a/src/dbm/dbm_shard.c +++ b/src/dbm/dbm_shard.c @@ -238,8 +238,10 @@ void dbm_shard_allocate_promised_blocks(dbm_shard_t *shard) { shard->data = dbm_mempool_host_malloc(shard->data_allocated * sizeof(double)); assert(shard->data != NULL); - memcpy(shard->data, data, shard->data_size * sizeof(double)); - dbm_mempool_host_free(data); + if (data != NULL) { + memcpy(shard->data, data, shard->data_size * sizeof(double)); + dbm_mempool_host_free(data); + } } // Zero new blocks. diff --git a/src/qs_harmonics_atom.F b/src/qs_harmonics_atom.F index 01735273c6..98bc55ce59 100644 --- a/src/qs_harmonics_atom.F +++ b/src/qs_harmonics_atom.F @@ -216,8 +216,6 @@ CONTAINS !$OMP PRIVATE(is1,l1,m1,is2,l2,m2,is,n,y) ALLOCATE (y(na)) - ALLOCATE (dc(nco(llmax), 3)) - !$OMP DO DO iso = 1, max_s_harm l = indso(1, iso) @@ -230,6 +228,7 @@ CONTAINS END DO ! ia END DO ! iso !$OMP END DO + DEALLOCATE (y) !$OMP DO DO ia = 1, na @@ -243,6 +242,7 @@ CONTAINS ! terms x^n1 y^n2 z^n3 transformed by spherical harmonics expansion coefficients ! + ALLOCATE (dc(nco(llmax), 3)) !$OMP DO DO ia = 1, na DO l = 0, indso(1, max_s_harm) @@ -296,6 +296,7 @@ CONTAINS END DO ! l END DO !ia !$OMP END DO + DEALLOCATE (dc) ! Expansion coefficients of the cartesian derivatives ! of the product of two harmonics : @@ -304,7 +305,6 @@ CONTAINS !$OMP DO COLLAPSE(3) DO iso1 = 1, maxs DO iso2 = 1, maxs - DO iso = 1, max_s_harm rx = 0.0_dp ry = 0.0_dp @@ -320,9 +320,7 @@ CONTAINS END DO harmonics%my_CG_dxyz(1, iso1, iso2, iso) = rx - harmonics%my_CG_dxyz(2, iso1, iso2, iso) = ry - harmonics%my_CG_dxyz(3, iso1, iso2, iso) = rz END DO @@ -356,9 +354,7 @@ CONTAINS END DO harmonics%my_CG_dxyz_asym(1, iso1, iso2, iso) = drx - harmonics%my_CG_dxyz_asym(2, iso1, iso2, iso) = dry - harmonics%my_CG_dxyz_asym(3, iso1, iso2, iso) = drz END DO ! iso @@ -384,8 +380,6 @@ CONTAINS ! expansion coefficients of product of polar angle derivatives (dslm(1...)) in ! spherical harmonics (used for tau functionals) - - DEALLOCATE (y, dc) !$OMP END PARALLEL CALL timestop(handle) diff --git a/src/qs_kinetic.F b/src/qs_kinetic.F index 5cd35153ea..5bdb63bb07 100644 --- a/src/qs_kinetic.F +++ b/src/qs_kinetic.F @@ -278,7 +278,7 @@ CONTAINS !$OMP first_sgfa, la_max, la_min, npgfa, nsgfa, nseta, rpgfa, set_radius_a, ncoa, ncob, force_a, & !$OMP zeta, first_sgfb, lb_max, lb_min, npgfb, nsetb, rpgfb, set_radius_b, nsgfb, p_block, dab, tab, & !$OMP slot, zetb, scon_a, scon_b, i, ic, irow, icol, f0, ff, found, trans, rab2, sgfa, sgfb, iset, jset, & -!$OMP hash, hash1, hash2, iatom8) & +!$OMP hash, hash1, hash2, iatom8, lock_num) & !$OMP REDUCTION (+ : pv_thread, force_thread ) !$OMP SINGLE diff --git a/src/qs_ks_atom.F b/src/qs_ks_atom.F index 32eefd4138..6d3f23452b 100644 --- a/src/qs_ks_atom.F +++ b/src/qs_ks_atom.F @@ -317,7 +317,7 @@ CONTAINS !$OMP , ikind, jkind, iatom, jatom, cell_b & !$OMP , basis_set_a, basis_set_b, img & !$OMP , found, next_task & -!$OMP , kkind, paw_atom & +!$OMP , kkind, paw_atom, lock_num & !$OMP , iac, alist_ac, kac, n_cont_a, list_a & !$OMP , ibc, alist_bc, kbc, n_cont_b, list_b & !$OMP , katom, rho_at, nsoctot & diff --git a/src/qs_overlap.F b/src/qs_overlap.F index 5a519ccadd..edf4664a7c 100644 --- a/src/qs_overlap.F +++ b/src/qs_overlap.F @@ -305,7 +305,7 @@ CONTAINS !$OMP matrix_s, matrix_p,basis_set_list_a, basis_set_list_b, cell_to_index, & !$OMP matrixkp_s, matrixkp_p, locks, natom) & !$OMP PRIVATE (oint, owork, pmat, sint, ikind, jkind, iatom, jatom, rab, cell, & -!$OMP basis_set_a, basis_set_b, & +!$OMP basis_set_a, basis_set_b, lock_num, & !$OMP first_sgfa, la_max, la_min, npgfa, nsgfa, nseta, rpgfa, set_radius_a, ncoa, ncob, force_a, & !$OMP zeta, first_sgfb, lb_max, lb_min, npgfb, nsetb, rpgfb, set_radius_b, nsgfb, p_block, dab, f, & !$OMP zetb, scon_a, scon_b, ic, irow, icol, f0, ff, found, trans, rab2, n1, n2, sgfa, sgfb, iset, jset, & diff --git a/src/qs_vcd_ao.F b/src/qs_vcd_ao.F index d2764d805f..da98253975 100644 --- a/src/qs_vcd_ao.F +++ b/src/qs_vcd_ao.F @@ -258,7 +258,7 @@ CONTAINS !$OMP PRIVATE (ikind, jkind, iatom, jatom, cell_b, & !$OMP iab, irow, icol, blocks_rv, & !$OMP found, iac, ibc, alist_ac, alist_bc, & -!$OMP na, np, nb, kkind, kac, kbc, i, & +!$OMP na, np, nb, kkind, kac, kbc, i, lock_num, & !$OMP hash, natom, acint, bcint, achint, bchint) !$OMP SINGLE @@ -453,7 +453,7 @@ CONTAINS !$OMP PRIVATE (kx_block,ky_block,kz_block,kab,qab,tab,ikind,jkind,iatom,jatom,rab,rac,rbc,cell, & !$OMP basis_set_a, basis_set_b, nseta, ncoa, ncob, ltab, nsetb, tkab, & !$OMP irow, icol, found, trans, sgfa, sgfb, iset, jset, & -!$OMP hash, hash1, hash2, iatom8, slot) & +!$OMP hash, hash1, hash2, iatom8, slot, lock_num) & !$OMP PRIVATE (first_sgfa, la_max, la_min, npgfa, nsgfa, rpgfa, set_radius_a, zeta, scon_a) & !$OMP PRIVATE (first_sgfb, lb_max, lb_min, npgfb, nsgfb, rpgfb, set_radius_b, zetb, scon_b) & !$OMP SHARED(particle_set, direction_or) & @@ -1624,7 +1624,7 @@ CONTAINS !$OMP SHARED (basis_set, matrix_rv, direction_Or, & !$OMP sap_int, nkind, eps_ppnl, locks, sab_all) & !$OMP PRIVATE (ikind, jkind, iatom, jatom, cell_b, rab, & -!$OMP iab, irow, icol, blocks_rvr, & +!$OMP iab, irow, icol, blocks_rvr, lock_num, & !$OMP found, iac, ibc, alist_ac, alist_bc, & !$OMP na, np, nb, kkind, kac, kbc, i, j, & !$OMP hash, natom, acint, bcint, achint, bchint) @@ -1922,7 +1922,7 @@ CONTAINS !$OMP SHARED (basis_set, matrix_rv, & !$OMP sap_int, nkind, eps_ppnl, locks, sab_orb) & !$OMP PRIVATE (ikind, jkind, iatom, jatom, cell_b, rab, & -!$OMP iab, irow, icol, blocks_rv, & +!$OMP iab, irow, icol, blocks_rv, lock_num, & !$OMP found, iac, ibc, alist_ac, alist_bc, & !$OMP na, np, nb, kkind, kac, kbc, i, j, & !$OMP hash, natom, acint, bcint, achint, bchint) @@ -2336,7 +2336,7 @@ CONTAINS !$OMP SHARED (basis_set, matrix_rv, & !$OMP sap_int, nkind, eps_ppnl, locks, sab_all) & !$OMP PRIVATE (ikind, jkind, iatom, jatom, cell_b, rab, & -!$OMP iab, irow, icol, blocks_rv, & +!$OMP iab, irow, icol, blocks_rv, lock_num, & !$OMP found, iac, ibc, alist_ac, alist_bc, & !$OMP na, np, nb, kkind, kac, kbc, i, & !$OMP hash, natom, acint, bcint, achint, bchint) diff --git a/src/rt_propagation_velocity_gauge.F b/src/rt_propagation_velocity_gauge.F index db34efefd1..d5415fb287 100644 --- a/src/rt_propagation_velocity_gauge.F +++ b/src/rt_propagation_velocity_gauge.F @@ -385,7 +385,7 @@ CONTAINS !$OMP PRIVATE (real_block, imag_block, acint_cos, achint_cos, bcint_cos, bchint_cos, acint_sin,& !$OMP achint_sin, bcint_sin, bchint_sin, slot, ikind, jkind, iatom, jatom, cell_b, rab, irow, icol,& !$OMP found, kkind, iac, ibc, alist_cos_ac, alist_cos_bc, alist_sin_ac, alist_sin_bc, kac, kbc, & -!$OMP na, np, nb, iatom8, hash) +!$OMP na, np, nb, iatom8, hash, lock_num) !$OMP SINGLE !$ ALLOCATE (locks(nlock))