Одним из достоинств структурного программирования является отсутствие мертвого кода.
Никак не могу понять: почему его не может там возникнуть?
Верно для "твёрдого" с.п. без скрытых форм GOTO : BREAK , EXIT, RETURN из "середины" функций
С другой стороны: могут "иметь место" ни разу не вызываемые функции и т.п.
Я бы слово "отсутствие" заменил бы на "помогает избежать"
P.S.
@Rsa97 say:
Да ладно...
if (false) {
... сюда никогда не попадём
}
for (i = 0; i < 0; i++) {
... и сюда тоже
}
1) См. выше
могут "иметь место" / "помогает избежать"
2) Не затруднит ли "for (i = 0; i < 0; i++)" переписать на ADA / Modula-3 ?
( мысленный эксперимент )
3) На тему "if (false)"
"Твёрдое структурное программирование" подразумевает доказательное программирование ( ADA SPARK)
См. образец:
https://ironsides.martincarlisle.com/
process_dns_request.adb
Counter := 1;
Additional_Count := 0;
while Counter <= NumFound and Additional_Count < DNS_Types.Unsigned_Short'Last-DNS_Types.Unsigned_Short(
2*Rr_Type.MaxNumRecords) loop
--# assert Counter >= 1 and Counter<=NumFound and
--# (for all Z in RR_Type.ReturnedRecordsIndexType =>
--# (Qname_Locations(Z) >= 0 and Qname_Locations(Z) < 16384)) and
--# Qname_Location >=0 and Qname_Location <= 16383 and
--# Answer_Count >=0 and Answer_Count <= 65535 and
--# Additional_Count >= 0 and
--# Additional_Count < DNS_Types.Unsigned_Short'Last-DNS_Types.Unsigned_Short(
--# 2*Rr_Type.MaxNumRecords) and
--# NumFound >= 0 and NumFound <= rr_type.MaxNumRecords and
--# Integer(Output_Bytes) >= DNS_Types.Header_Bits/8+1 and
--# Integer(Output_Bytes) <= DNS_Types.Packet_Size;
Start_Byte := DNS_Types.Packet_Bytes_Range(Integer(Output_Bytes) -
DNS_Types.Header_Bits/8);
Create_Response_A(
Start_Byte => Start_Byte,
Domainname => NS_Replies(Counter).nameserver,
Qname_Location => Qname_Locations(Counter),
Output_Packet => Output_Packet,
Answer_Count => Additional_Count,
Output_Bytes => Output_Bytes);
Start_Byte := DNS_Types.Packet_Bytes_Range(Integer(Output_Bytes) -
DNS_Types.Header_Bits/8);
Create_Response_AAAA(
Start_Byte => Start_Byte,
Domainname => NS_Replies(Counter).nameserver,
Qname_Location => Qname_Locations(Counter),
Output_Packet => Output_Packet,
Answer_Count => Additional_Count,
Output_Bytes => Output_Bytes);
Counter := Counter + 1;
end loop;
else
Protected_SPARK_IO_05.SPARK_IO_PO.Put_Line(Protected_SPARK_IO_05.SPARK_IO_PO.Standard_Output,"bad query type", 0);
-- ada.text_io.put_line("qc: " & dns_types.Query_Type'image(Query_Type));
Create_Response_Error(
Input_Bytes => Input_Bytes,
Output_Packet => Output_Packet,
Output_Bytes => Output_Bytes);
end if;
-- this assert helps with the VCG Heap overflow
--# assert
--# Answer_Count >=0 and Answer_Count <= 65535 and
--# Qname_Location >=0 and Qname_Location < 16384 and
--# Additional_Count >= 0 and
--# NumFound >= 0 and NumFound <= rr_type.MaxNumRecords and
--# Integer(Output_Bytes) >= DNS_Types.Header_Bits/8+1 and
--# Integer(Output_Bytes) <= DNS_Types.Packet_Size;
DNSSEC := False;
Max_Transmit := DNS_Types.UDP_Max_Size;
-- Handle EDNS additional OPT record here!
if Input_Packet.Header.QDCount = 1 and
Input_Packet.Header.ARCount = 1 and
Additional_Count < DNS_Types.Unsigned_Short'Last then
Start_Byte := DNS_Types.Packet_Bytes_Range(Integer(Output_Bytes) -
DNS_Types.Header_Bits/8);
Create_Response_EDNS(
Input_Packet => Input_Packet,
Input_Bytes => Input_Bytes,
Query_End_Byte => Query_End_Byte,
Start_Byte => Start_Byte,
Output_Packet => Output_Packet,
Output_Bytes => Output_Bytes,
Additional_Count => Additional_Count,
DNSSEC => DNSSEC,
Max_Transmit => Max_Transmit);
elsif Input_Packet.Header.QDCount /= 1 then
Protected_SPARK_IO_05.SPARK_IO_PO.Put_Line(Protected_SPARK_IO_05.SPARK_IO_PO.Standard_Output,"query count > 1", 0);
elsif Input_Packet.Header.ARCount > 1 then
Protected_SPARK_IO_05.SPARK_IO_PO.Put_Line(Protected_SPARK_IO_05.SPARK_IO_PO.Standard_Output,"ar count > 1", 0);
end if;