66#include " source_base/timer.h"
77#include " source_io/module_parameter/parameter.h"
88
9- #include < cstdlib>
109#include < cstring>
1110#include < fstream>
11+ #include < limits>
1212#include < sstream>
13+ #include < stdexcept>
1314#include < vector>
1415
1516// local inline helpers for eigenvalue calculation (JacobiRotate, CalculateEigenvalues)
@@ -553,7 +554,32 @@ void Plus_U_Base::read_occup_m(const UnitCell& ucell,
553554 }
554555 else
555556 {
556- value = std::atoi (token.c_str () + tag.size ());
557+ const std::string number = token.substr (tag.size ());
558+ if (number.empty ())
559+ {
560+ return false ;
561+ }
562+
563+ std::size_t consumed = 0 ;
564+ try
565+ {
566+ const long parsed = std::stol (number, &consumed, 10 );
567+ if (consumed != number.size ()
568+ || parsed < static_cast <long >(std::numeric_limits<int >::min ())
569+ || parsed > static_cast <long >(std::numeric_limits<int >::max ()))
570+ {
571+ return false ;
572+ }
573+ value = static_cast <int >(parsed);
574+ }
575+ catch (const std::invalid_argument&)
576+ {
577+ return false ;
578+ }
579+ catch (const std::out_of_range&)
580+ {
581+ return false ;
582+ }
557583 }
558584 return static_cast <bool >(ifdftu);
559585 };
@@ -574,8 +600,12 @@ void Plus_U_Base::read_occup_m(const UnitCell& ucell,
574600 break ;
575601 }
576602
577- if (read_tagged_int ( word, " Atom=" , iat) )
603+ if (word. compare ( 0 , 5 , " Atom=" ) == 0 )
578604 {
605+ if (!read_tagged_int (word, " Atom=" , iat) || iat < 1 || iat > ucell.nat )
606+ {
607+ ModuleBase::WARNING_QUIT (" Plus_U_Base::read_occup_m" , " WRONG ATOM INDEX IN LOCAL OCCUPATION NUMBER MATRIX FROM Plus_U FILE" );
608+ }
579609 iat -= 1 ;
580610 ifdftu >> word;
581611
0 commit comments