FHEM Forum

FHEM => Sonstiges => Thema gestartet von: RichardCZ am 12 April 2020, 21:58:55

Titel: DevIo Bug
Beitrag von: RichardCZ am 12 April 2020, 21:58:55
Ich melde das hier wegen

FHEM/DevIo.pm                rudolfkoenig         Sonstiges

DevIo kann derzeit IMHO gar nicht compilieren. Gemerkt habe ich das erst nach einer Migration bei mir DevIo -> HomeBot::IO
https://gl.petatech.eu/root/HomeBot/-/blob/4e7ad071569015698f1d58d97d73519a8746a22b/lib/HomeBot/IO.pm

Nachdem das Teil im privaten Namespace ist, klappt auch ein perl -c compile check. Wie dem auch sei:

https://svn.fhem.de/trac/browser/trunk/fhem/FHEM/DevIo.pm#L118

anser -> answer

edit:

Ah - jetzt verstehe ich warum das Teil compiliert. Es fehlt ein use strict; use warnings;
Titel: Antw:DevIo Bug
Beitrag von: RichardCZ am 12 April 2020, 22:15:00
bei der Gelegenheit kann man auch gleich das  $r == "" in Zeile 116 drüber fixen.
Titel: Antw:DevIo Bug
Beitrag von: rudolfkoenig am 13 April 2020, 08:49:47
Danke fuer den Hinweis, habe use strict hizugefuegt und gemeldete Fehler/Warnungen entfernt.
Titel: Antw:DevIo Bug
Beitrag von: noansi am 13 April 2020, 11:10:15
Hallo Rudolf,

#use warnings;

führt bei mir zu vielen Log-Einträgen auch im laufenden Betrieb:
2020.04.13 11:03:18.481 1: PERL WARNING: Subroutine DevIo_setStates redefined at /opt/fhem/FHEM/DevIo.pm line 20.
2020.04.13 11:03:18.490 1: PERL WARNING: Subroutine DevIo_DoSimpleRead redefined at /opt/fhem/FHEM/DevIo.pm line 31.
2020.04.13 11:03:18.495 1: PERL WARNING: Subroutine DevIo_SimpleRead redefined at /opt/fhem/FHEM/DevIo.pm line 67.
2020.04.13 11:03:18.498 1: PERL WARNING: Subroutine DevIo_SimpleReadWithTimeout redefined at /opt/fhem/FHEM/DevIo.pm line 91.
2020.04.13 11:03:18.503 1: PERL WARNING: Subroutine DevIo_TimeoutRead redefined at /opt/fhem/FHEM/DevIo.pm line 107.
2020.04.13 11:03:18.509 1: PERL WARNING: Subroutine DevIo_SimpleWrite redefined at /opt/fhem/FHEM/DevIo.pm line 130.
2020.04.13 11:03:18.516 1: PERL WARNING: Subroutine DevIo_Expect redefined at /opt/fhem/FHEM/DevIo.pm line 161.
2020.04.13 11:03:18.577 1: PERL WARNING: Subroutine DevIo_OpenDev redefined at /opt/fhem/FHEM/DevIo.pm line 224.
2020.04.13 11:03:18.586 1: PERL WARNING: Subroutine DevIo_SetHwHandshake redefined at /opt/fhem/FHEM/DevIo.pm line 492.
2020.04.13 11:03:18.594 1: PERL WARNING: Subroutine DevIo_CloseDev redefined at /opt/fhem/FHEM/DevIo.pm line 503.
2020.04.13 11:03:18.597 1: PERL WARNING: Subroutine DevIo_IsOpen redefined at /opt/fhem/FHEM/DevIo.pm line 551.
2020.04.13 11:03:18.602 1: PERL WARNING: Subroutine DevIo_Disconnected redefined at /opt/fhem/FHEM/DevIo.pm line 563.
2020.04.13 11:03:32.494 1: PERL WARNING: Subroutine DevIo_setStates redefined at /opt/fhem/FHEM/DevIo.pm line 20.
2020.04.13 11:03:32.502 1: PERL WARNING: Subroutine DevIo_DoSimpleRead redefined at /opt/fhem/FHEM/DevIo.pm line 31.
2020.04.13 11:03:32.506 1: PERL WARNING: Subroutine DevIo_SimpleRead redefined at /opt/fhem/FHEM/DevIo.pm line 67.
2020.04.13 11:03:32.509 1: PERL WARNING: Subroutine DevIo_SimpleReadWithTimeout redefined at /opt/fhem/FHEM/DevIo.pm line 91.
2020.04.13 11:03:32.514 1: PERL WARNING: Subroutine DevIo_TimeoutRead redefined at /opt/fhem/FHEM/DevIo.pm line 107.
2020.04.13 11:03:32.520 1: PERL WARNING: Subroutine DevIo_SimpleWrite redefined at /opt/fhem/FHEM/DevIo.pm line 130.
2020.04.13 11:03:32.528 1: PERL WARNING: Subroutine DevIo_Expect redefined at /opt/fhem/FHEM/DevIo.pm line 161.
2020.04.13 11:03:32.580 1: PERL WARNING: Subroutine DevIo_OpenDev redefined at /opt/fhem/FHEM/DevIo.pm line 224.
2020.04.13 11:03:32.589 1: PERL WARNING: Subroutine DevIo_SetHwHandshake redefined at /opt/fhem/FHEM/DevIo.pm line 492.
2020.04.13 11:03:32.596 1: PERL WARNING: Subroutine DevIo_CloseDev redefined at /opt/fhem/FHEM/DevIo.pm line 503.
2020.04.13 11:03:32.599 1: PERL WARNING: Subroutine DevIo_IsOpen redefined at /opt/fhem/FHEM/DevIo.pm line 551.
2020.04.13 11:03:32.604 1: PERL WARNING: Subroutine DevIo_Disconnected redefined at /opt/fhem/FHEM/DevIo.pm line 563.
2020.04.13 11:04:18.483 1: PERL WARNING: Subroutine DevIo_setStates redefined at /opt/fhem/FHEM/DevIo.pm line 20.
2020.04.13 11:04:18.493 1: PERL WARNING: Subroutine DevIo_DoSimpleRead redefined at /opt/fhem/FHEM/DevIo.pm line 31.
2020.04.13 11:04:18.497 1: PERL WARNING: Subroutine DevIo_SimpleRead redefined at /opt/fhem/FHEM/DevIo.pm line 67.
2020.04.13 11:04:18.500 1: PERL WARNING: Subroutine DevIo_SimpleReadWithTimeout redefined at /opt/fhem/FHEM/DevIo.pm line 91.
2020.04.13 11:04:18.505 1: PERL WARNING: Subroutine DevIo_TimeoutRead redefined at /opt/fhem/FHEM/DevIo.pm line 107.
2020.04.13 11:04:18.511 1: PERL WARNING: Subroutine DevIo_SimpleWrite redefined at /opt/fhem/FHEM/DevIo.pm line 130.
2020.04.13 11:04:18.518 1: PERL WARNING: Subroutine DevIo_Expect redefined at /opt/fhem/FHEM/DevIo.pm line 161.
2020.04.13 11:04:18.572 1: PERL WARNING: Subroutine DevIo_OpenDev redefined at /opt/fhem/FHEM/DevIo.pm line 224.
2020.04.13 11:04:18.581 1: PERL WARNING: Subroutine DevIo_SetHwHandshake redefined at /opt/fhem/FHEM/DevIo.pm line 492.
2020.04.13 11:04:18.588 1: PERL WARNING: Subroutine DevIo_CloseDev redefined at /opt/fhem/FHEM/DevIo.pm line 503.
2020.04.13 11:04:18.592 1: PERL WARNING: Subroutine DevIo_IsOpen redefined at /opt/fhem/FHEM/DevIo.pm line 551.
2020.04.13 11:04:18.597 1: PERL WARNING: Subroutine DevIo_Disconnected redefined at /opt/fhem/FHEM/DevIo.pm line 563.
2020.04.13 11:04:33.463 1: PERL WARNING: Subroutine DevIo_setStates redefined at /opt/fhem/FHEM/DevIo.pm line 20.
2020.04.13 11:04:33.472 1: PERL WARNING: Subroutine DevIo_DoSimpleRead redefined at /opt/fhem/FHEM/DevIo.pm line 31.
2020.04.13 11:04:33.477 1: PERL WARNING: Subroutine DevIo_SimpleRead redefined at /opt/fhem/FHEM/DevIo.pm line 67.
2020.04.13 11:04:33.480 1: PERL WARNING: Subroutine DevIo_SimpleReadWithTimeout redefined at /opt/fhem/FHEM/DevIo.pm line 91.
2020.04.13 11:04:33.485 1: PERL WARNING: Subroutine DevIo_TimeoutRead redefined at /opt/fhem/FHEM/DevIo.pm line 107.
2020.04.13 11:04:33.490 1: PERL WARNING: Subroutine DevIo_SimpleWrite redefined at /opt/fhem/FHEM/DevIo.pm line 130.
2020.04.13 11:04:33.498 1: PERL WARNING: Subroutine DevIo_Expect redefined at /opt/fhem/FHEM/DevIo.pm line 161.
2020.04.13 11:04:33.581 1: PERL WARNING: Subroutine DevIo_OpenDev redefined at /opt/fhem/FHEM/DevIo.pm line 224.
2020.04.13 11:04:33.600 1: PERL WARNING: Subroutine DevIo_SetHwHandshake redefined at /opt/fhem/FHEM/DevIo.pm line 492.
2020.04.13 11:04:33.617 1: PERL WARNING: Subroutine DevIo_CloseDev redefined at /opt/fhem/FHEM/DevIo.pm line 503.
2020.04.13 11:04:33.621 1: PERL WARNING: Subroutine DevIo_IsOpen redefined at /opt/fhem/FHEM/DevIo.pm line 551.
2020.04.13 11:04:33.636 1: PERL WARNING: Subroutine DevIo_Disconnected redefined at /opt/fhem/FHEM/DevIo.pm line 563.


Welches Modul DevIo.pm ständig nachlädt, weiss ich noch nicht, aber die use Warnings in DevIo.pm auszukommentieren stoppt die Meldungsflut.

Gruß, Ansgar.
Titel: Antw:DevIo Bug
Beitrag von: rudolfkoenig am 13 April 2020, 11:20:56
Kanst Du mir verraten, wie man das Problem nachstellt? Ich sehe das bei mir nicht.
Titel: Antw:DevIo Bug
Beitrag von: noansi am 13 April 2020, 11:28:09
Hallo Rudolf,

ZitatKanst Du mir verraten, wie man das Problem nachstellt? Ich sehe das bei mir nicht.
leider nicht.
Ich wüßte derzeit nicht, wie ich in DevIo raus bekommen kann, wer es gerade nachlädt?!?

Gruß, Ansgar.
Titel: Antw:DevIo Bug
Beitrag von: rudolfkoenig am 13 April 2020, 11:34:30
"attr global stacktrace" ?
Titel: Antw:DevIo Bug
Beitrag von: noansi am 13 April 2020, 11:50:38
Hallo Rudolf,

Zitat"attr global stacktrace" ?
spuckt leider nicht mehr aus, es bleibt bei den Warnings.

Gruß, Ansgar.
Titel: Antw:DevIo Bug
Beitrag von: herrmannj am 13 April 2020, 11:57:29
Benutzt du devio in irgendeiner myUtils?
Titel: Antw:DevIo Bug
Beitrag von: noansi am 13 April 2020, 12:00:35
Hallo Rudolf,

ich hätte da einen Verdächtigen mit global verbose 5 im Angebot:
2020.04.13 11:55:55.311 4: BlockingCall (FRITZBOX_Readout_Run_Web): created child (30960), uses telnetPort to connect back
2020.04.13 11:55:55.345 4: FRITZBOX FritzBoxStatus: Readout_Start.755 Fork process FRITZBOX_Readout_Run_Web
2020.04.13 11:55:55.366 1: PERL WARNING: Subroutine DevIo_setStates redefined at /opt/fhem/FHEM/DevIo.pm line 20.
2020.04.13 11:55:55.375 1: PERL WARNING: Subroutine DevIo_DoSimpleRead redefined at /opt/fhem/FHEM/DevIo.pm line 31.
2020.04.13 11:55:55.381 1: PERL WARNING: Subroutine DevIo_SimpleRead redefined at /opt/fhem/FHEM/DevIo.pm line 67.
2020.04.13 11:55:55.385 1: PERL WARNING: Subroutine DevIo_SimpleReadWithTimeout redefined at /opt/fhem/FHEM/DevIo.pm line 91.
2020.04.13 11:55:55.391 1: PERL WARNING: Subroutine DevIo_TimeoutRead redefined at /opt/fhem/FHEM/DevIo.pm line 107.
2020.04.13 11:55:55.398 1: PERL WARNING: Subroutine DevIo_SimpleWrite redefined at /opt/fhem/FHEM/DevIo.pm line 130.
2020.04.13 11:55:55.407 1: PERL WARNING: Subroutine DevIo_Expect redefined at /opt/fhem/FHEM/DevIo.pm line 161.
2020.04.13 11:55:55.475 1: PERL WARNING: Subroutine DevIo_OpenDev redefined at /opt/fhem/FHEM/DevIo.pm line 224.
2020.04.13 11:55:55.485 1: PERL WARNING: Subroutine DevIo_SetHwHandshake redefined at /opt/fhem/FHEM/DevIo.pm line 492.
2020.04.13 11:55:55.495 1: PERL WARNING: Subroutine DevIo_CloseDev redefined at /opt/fhem/FHEM/DevIo.pm line 503.
2020.04.13 11:55:55.499 1: PERL WARNING: Subroutine DevIo_IsOpen redefined at /opt/fhem/FHEM/DevIo.pm line 551.
2020.04.13 11:55:55.505 1: PERL WARNING: Subroutine DevIo_Disconnected redefined at /opt/fhem/FHEM/DevIo.pm line 563.
2020.04.13 11:55:55.564 4: Connection accepted from telnetPort_127.0.0.1_60876
2020.04.13 11:55:55.572 5: Cmd: >{BlockingRegisterTelnet($cl,12)}<
2020.04.13 11:55:55.579 4: FRITZBOX FritzBoxStatus: Readout_Run_Web.1339 Prepare query string for luaQuery.
2020.04.13 11:55:55.583 5: FRITZBOX FritzBoxStatus: Web_Query.4727 Request data via API luaQuery.
2020.04.13 11:55:57.012 5: FRITZBOX FritzBoxStatus: Web_Query.4735 Response: 200 OK


Gruß, Ansgar.
Titel: Antw:DevIo Bug
Beitrag von: rudolfkoenig am 13 April 2020, 12:11:24
- DevIo wird von vielen Modulen (56 an der Zahl) per require reingeholt, bei 20 mit use.
- die erwaehnten Warnungen gibt es, wenn bei use oder require unterschiedliche Pfadangaben gemacht werden.
- die meisten verwenden $attr{global}{modpath}/FHEM/DevIo.pm, es gibt aber auch $main::attr{global}{modpath}/FHEM/DevIo.pm und DevIo.pm.
- um den Aufruhr wg. sinnlosen Fehlermeldungen niedrig zu halten, habe ich "use warnings" aus DevIo.pm entfernt.
- ich meine use DevIo ist die richtige Loesung, ich habe meine Module, die require mit Pfad verwendet haben (CUL, ZWDongle und  autocreate) umgebaut.
- damit das Problem gefixt wird, habe ich das SVN pre-commit Hook erweitert, so dass require.*modpath.*DevIo.pm untersagt, und use empfohlen wird.
Titel: Antw:DevIo Bug
Beitrag von: noansi am 13 April 2020, 12:28:24
Hallo Rudolf,

in fhem.pl steckt noch ein require "$attr{global}{modpath}/FHEM/DevIo.pm" in der Funktion fhemFork()
sub
fhemFork()
{
  my $pid = fork;
  if(!defined($pid)) {
    Log 1, "Cannot fork: $!";
    stacktrace() if($attr{global}{stacktrace});
    return undef;
  }

  return $pid if($pid);

  # Child here
  # Close FDs as we cannot restart FHEM if child keeps TCP Serverports open
  foreach my $d (sort keys %defs) {
    my $h = $defs{$d};
    $h->{DBH}->{InactiveDestroy} = 1
      if($h->{DBH} && $h->{TYPE} eq 'DbLog'); #Forum #43271
    TcpServer_Close($h) if($h->{SERVERSOCKET});
    if($h->{DeviceName}) {
      require "$attr{global}{modpath}/FHEM/DevIo.pm";
      DevIo_CloseDev($h,1);
    }
  }
  $SIG{CHLD} = 'DEFAULT';  # Forum #50898
  $fhemForked = 1;
  return 0;
}


Gruß, Ansgar.
Titel: Antw:DevIo Bug
Beitrag von: rudolfkoenig am 13 April 2020, 12:34:53
Danke, habs geaendert.
Titel: Antw:DevIo Bug
Beitrag von: noansi am 13 April 2020, 13:39:42
Hallo Rudolf,

noch als Rückmeldung, das require "$attr{global}{modpath}/FHEM/DevIo.pm" in fhemFork() in fhem.pl hat die Warnings geworfen.

Ich kann sie durch Wechsel zwischen den Versionen require "$attr{global}{modpath}/FHEM/DevIo.pm" und require "DevIo.pm"; ein- und ausschalten (mit aktivem use warnings; in DevIo.pm).

Gruß, Ansgar.

PS: Die übrigen DevIo.pm Änderungen habe ich zuvor auch nachgezogen.
Titel: Antw:DevIo Bug
Beitrag von: betateilchen am 13 April 2020, 21:39:05
Zitat von: rudolfkoenig am 13 April 2020, 08:49:47
Danke fuer den Hinweis, habe use strict hizugefuegt und gemeldete Fehler/Warnungen entfernt.


73_PRESENCE.pm            20782 2019-12-19 10:51:06Z markusbloch
DevIo.pm                  21659 2020-04-13 10:08:36Z rudolfkoenig


Hallo Rudi,

das Hinzufügen von "use strict" führt dazu, dass nach einem FHEM-Update PRESENCE nicht mehr funktioniert.

Can't use string ("PRESENCE_DoInit") as a subroutine ref while "strict refs" in use at FHEM/DevIo.pm line 250.

Kommentiert man das "use strict" in DevIo.pm aus, ist (vorläufig) alles wieder gut.
Titel: Antw:DevIo Bug
Beitrag von: rudolfkoenig am 13 April 2020, 23:11:40
Danke fuer den Hinweis, ich habe die Zeile in einem "no strict refs" Klammer gesetzt, hoffentlich reicht das.
Titel: Antw:DevIo Bug
Beitrag von: betateilchen am 13 April 2020, 23:33:40
Scheint zu funktionieren, auf jeden Fall verhält sich meine Testinstallation damit nun unauffällig.
Titel: Antw:DevIo Bug
Beitrag von: mahowi am 14 April 2020, 08:55:46
70_KODI.pm scheint mit use strict auch Probleme zu haben: https://forum.fhem.de/index.php?topic=110174
Titel: Antw:DevIo Bug
Beitrag von: CoolTux am 14 April 2020, 09:26:42
Hier mal eine kleine Analyse welche Module alle einen String als Callback übergeben

00_DFPlayerMini.pm
00_SIGNALduino.pm
32_withings.pm
36_LaCrosseGateway.pm     bin ich mir unsicher da anonymous sub
36_PrecipitationSensor.pm   bin ich mir unsicher da anonymous sub
98_Hyperion.pm


Vorschlag:
use strict   wird für 3 Monate wieder entfernt und wir geben den Maintainern damit Zeit Ihre Module gerade zu ziehen.



Grüße
Titel: Antw:DevIo Bug
Beitrag von: rudolfkoenig am 14 April 2020, 09:53:23
Ich habe die Zele 237 auch in einem "no strict refs" Klammer gesetzt, und fhemupdate.pl angestossen.
Titel: Antw:DevIo Bug
Beitrag von: CoolTux am 14 April 2020, 09:56:25
Guten Morgen Rudi,

Aber bleibt doch nicht so, oder? Ich meine wir arbeiten schon darauf hin das ganze sauber hin zu bekommen?


Grüße
Marko
Titel: Antw:DevIo Bug
Beitrag von: herrmannj am 14 April 2020, 10:02:46
No strict refs ist imho 'sauber' (wenngleich es sicher den akademischen Weg gibt. )
Titel: Antw:DevIo Bug
Beitrag von: rudolfkoenig am 14 April 2020, 10:27:41
ZitatAber bleibt doch nicht so, oder? Ich meine wir arbeiten schon darauf hin das ganze sauber hin zu bekommen?
Ich bin (noch?) nicht ueberzeugt, dass Funktionsamen als Callback verboten werden muessen: ich sehe keine Nachteile, aber klare Vorteile.
Titel: Antw:DevIo Bug
Beitrag von: CoolTux am 14 April 2020, 10:31:21
Zitat von: rudolfkoenig am 14 April 2020, 10:27:41
Ich bin (noch?) nicht ueberzeugt, dass Funktionsamen als Callback verboten werden muessen: ich sehe keine Nachteile, aber klare Vorteile.

Ein Verbot von Funktionsnamen als Callback ist auch nicht meine Intension. Ich dachte mehr daran das ganze use strict sicher zu machen.
Mir würde da nur eine Prüfung zu einfallen. Ich arbeite aber noch am Verständnis des ganzen  :)

Aber lange Rede kurzer Splint, ich schaue ob ich Dir da etwas anbieten kann.
Titel: Antw:DevIo Bug
Beitrag von: Christoph Morrison am 14 April 2020, 10:40:02
Zitat von: CoolTux am 14 April 2020, 09:56:25
Aber bleibt doch nicht so, oder? Ich meine wir arbeiten schon darauf hin das ganze sauber hin zu bekommen?

In guter alter FHEM-Tradition heißt "sauber" dann no strict refs gleich vorne hin geklatscht, der Interpreter nervt nicht mehr und keine macht sich die Mühe zu verstehen, warum etwas ein Problem ist oder sein könnte.

Ich zitiere mal Perldoc zu strict (https://perldoc.perl.org/strict.html):
Zitat
The strict pragma disables certain Perl expressions that could behave unexpectedly or are difficult to debug, turning them into errors.

Was ist daran "akademisch", herrmannj? strict hat man nicht erfunden weil alle irgendwie dumm oder böse sind, sondern weil andere, besser und länger Perl programmierende Leute bemerkt haben, dass es Stellen gibt, die problematisch sind, weil sie eben anfällig für Fehler sind. Weise Menschen lernen aus den Fehlern anderer.
Titel: Antw:DevIo Bug
Beitrag von: rudolfkoenig am 14 April 2020, 10:46:16
Weise Menschen waegen die Argumente fuer und wieder ab, und entscheiden.
Und werden nicht hektisch, wenn die Mehrheit laut schreit, oder weil Unfehlbare das so gesagt haben.
Titel: Antw:DevIo Bug
Beitrag von: herrmannj am 14 April 2020, 11:12:23
Christoph, lass doch bitte die Polemik und außerdem ist Deine Kritik _hier_ objektiv auch komplett falsch. Ja ich verstehe worauf Du hinaus willst.

Schaust Du aber in den patch dann siehst Du dass in der Zeile unmittelbar oberhalb des callbacks steht: 'no strict refs' und direkt darunter steht 'use strict'. Weise Menschen haben das pragma 'no strict refs' genau für diesen Fall eingebaut. Wenn wir, was ich begrüßen würde, konstruktiv über schöner reden dann sähe das für mich so aus:

{
   no strict 'refs';
   $callback->($hash,$r) if($callback);
};


strict ist lexically scoped.

Akademisch: mit verschiedenen Konstruktionen kann man die Notwendigkeit von 'no strict refs' wegbekommen die Funktionalität aber beibehalten. Das ist jetzt in meinen Augen aber Kosmetik, so ist es sauber gerade weil eben niemand "no strict refs gleich vorne hin klatscht". Kinners, lasst die Kirche im Dorf.
Titel: Antw:DevIo Bug
Beitrag von: CoolTux am 14 April 2020, 12:04:34
Ich habe mir das nun mal eine Stunde lang angeschaut und aktuell halte ich persönlich die derzeitige Lösung als in Ordnung.
Man kann noch eine Prüfung einbauen aber das würde dann auch nur in einem no strict 'refs' enden und sogar eine Zeile mehr Code verlangen.

Daher. Danke Rudi für die schnelle Reaktion!
Titel: Antw:DevIo Bug
Beitrag von: vbs am 14 April 2020, 12:21:15
Nur für mich zum Verständnis: also die Übergabe der Funktionen als Strings in DevIo_OpenDev ist nicht mehr erwünscht/erlaubt mittelfristig? Werde es dann gerne entsprechend ändern.
Titel: Antw:DevIo Bug
Beitrag von: CoolTux am 14 April 2020, 12:30:17
Zitat von: vbs am 14 April 2020, 12:21:15
Nur für mich zum Verständnis: also die Übergabe der Funktionen als Strings in DevIo_OpenDev ist nicht mehr erwünscht/erlaubt mittelfristig? Werde es dann gerne entsprechend ändern.

Also wenn ich das so alles korrekt verstanden habe wird erwartet das $callback eine Codereferenz ist. Da ja
$calback->(...) ausgeführt wird.

Korrigiert mich bitte jemand wenn ich das falsch verstanden habe.

Ist dem nicht der Fall dann meckert ein use strict rum.
Titel: Antw:DevIo Bug
Beitrag von: vbs am 14 April 2020, 12:38:13
Ich hoffe, es zählt als offizielle Quelle, aber das Wiki (https://wiki.fhem.de/wiki/DevIo) sagt eindeutig:
"$callback: Der Name (als Zeichenkette) oder die Referenz auf eine Modulfunktion, welche aufgerufen werden soll um evtl. Fehlermeldunge..."

Die Variante mit String wird sogar als erstes erwähnt. Aber wie gesagt: ich mache alles mit, wenn ihr mir sagt, dass das nicht mehr so sein soll.
Titel: Antw:DevIo Bug
Beitrag von: rudolfkoenig am 14 April 2020, 12:49:53
@vbs: Ich habe z.Zt. noch keine ueberzeugende/ausrechende Argumente (und damit auch keine Plaene), um strings / Funktionsnamen zu untersagen.
An bestimmten Stellen, wie InternalTimer waere das kontraproduktiv, weil man damit DiagnoseFunktionen wie fhemdebug timerList sinnlos werden.
Man koennte evtl. die Funktionalitaet von timerList auch ohne funktionsNamen implementieren, ich sehe aber keine Vorteile, nur den Aufwand.

@CoolTux: eine CodeReferenz wird nicht "erwartet", nur use strict besteht darauf. Es wird irgendetwas erwartet, was man als Funktion aufrufen kann.
Titel: Antw:DevIo Bug
Beitrag von: CoolTux am 14 April 2020, 12:55:01
Danke Rudi für die Info.
Titel: Antw:DevIo Bug
Beitrag von: noansi am 14 April 2020, 14:17:07
Hallo Rudolf,

in DevIoTS habe ich die Änderungen auch mal alle eingepflegt, da mangels Funktionsnutzung $anser auch rein geflutscht war. Nebenbei ist mir darüber fhemFork mit den DevIo_CloseDev aufgefallen, was ich auch gleich mit berücksichtigt habe.

ZitatAn bestimmten Stellen, wie InternalTimer waere das kontraproduktiv, weil man damit DiagnoseFunktionen wie fhemdebug timerList sinnlos werden.
Man koennte evtl. die Funktionalitaet von timerList auch ohne funktionsNamen implementieren, ich sehe aber keine Vorteile, nur den Aufwand.

Hier mal ein Vorschlag für fhemdebug_timerList (der auch 97_timerTS.pm berücksichtigt  ;) ), da auch bei Timern Funktionsreferenzen statt Funktionsnamen möglich sind (und ich es auch so nutze) und es schön ist, deren Namen zu sehen:
sub
fhemdebug_timerList($)
{
  my ($param) = @_;
  my @res;

  my $tt;
  my $cv;
  my $tfnm;
  for my $h (@intAtA) {
    $tt = $h->{TRIGGERTIME};
    if (ref($h->{FN}) ne "") {
      $cv = svref_2object($h->{FN});
      $tfnm = $cv->GV->NAME; # get function name
    }
    else {
      $tfnm = $h->{FN}; # just function string/name
    }
    push(@res, sprintf("%s.%05d %s%s",
      FmtDateTime($tt), int(($tt-int($tt))*100000), $tfnm,
      $h->{STACKTRACE} ? $h->{STACKTRACE} : ""));
  }
  if (defined(@intAtTS)) { # for 97_timerTS.pm
    for my $h (@intAtTS) {
      $tt = $h->{TRIGGERTIME};
      if (ref($h->{FN}) ne "") {
        $cv = svref_2object($h->{FN});
        $tfnm = $cv->GV->NAME; # get function name
      }
      else {
        $tfnm = $h->{FN}; # just function string/name
      }
      push(@res, sprintf("%s.%05d %s%s",
        FmtDateTime($tt), int(($tt-int($tt))*100000), $tfnm,
        $h->{STACKTRACE} ? $h->{STACKTRACE} : ""));
    }
  }
  return join("\n", @res);
}


Perl Internals Kenner könnten die Performance Unterschiede zwischen Funktionsnamen und Funktionsreferenzen aufzeichnen.

Gruß, Ansgar.
Titel: Antw:DevIo Bug
Beitrag von: rudolfkoenig am 14 April 2020, 15:20:53
Dane fuer den Hinweis, ich habe timerList mit svref_2object erweitert.
Titel: Antw:DevIo Bug
Beitrag von: RichardCZ am 15 April 2020, 14:49:36
Zitat von: rudolfkoenig am 14 April 2020, 12:49:53
@vbs: Ich habe z.Zt. noch keine ueberzeugende/ausrechende Argumente (und damit auch keine Plaene), um strings / Funktionsnamen zu untersagen.

Wobei sich die Frage stellt ob die Argumente objektiv nicht überzeugend waren, oder Du sie nur nicht als solche erkannt hast.
Insbesondere wenn sie von "Unfehlbaren" kommen. Pffff. Nicht mit uns.

Das Schlüsselwort lautet Symbolic Reference

PBP Seite 230 - 231 "Never use symbolic references"  (*)

Das ist eine ziemlich nicht-relativierende Aussage.

Häte man die Fahrradkette

$hash->{DefFn}    = \&Meinetwegen_Define;

statt

$hash->{DefFn}    = "Meinetwegen_Define";

genommen, dann hätte man auch nicht diesen ganzen Sotter mit no warnings 'refs';

Überdies hoffe ich, dass in der Diskussion nicht der Anfang vergessen wird: dass nämlich der fehlende "use strict" einen ziemlichen Hammer-Bug kaschiert hat. Jahrelang?




(*) Ich danke aber für die Gelegenheit mir diese 2 Seiten nun nochmal durchgelesen haben zu können und wünsche jedem genug Englischverständnis um Conways Seitenhiebe zu erfassen.
Titel: Antw:DevIo Bug
Beitrag von: noansi am 17 April 2020, 17:37:30
Hallo Richard,

Zitatnämlich der fehlende "use strict" einen ziemlichen Hammer-Bug kaschiert hat. Jahrelang?
$anser: Nein, Monatelang. Seit Mai 2019. Aber auch das spricht für "use strict" im regulären Code.
$r == "": existierte etwa 5 1/2 Jahre lang.

Rudolf hat das auch (in diesem Fall zu schnell) eingesehen, denn es steht ja nun im Code drin, mit eben den anderen Fixes und notwendigen Ausnahmen, um es kompatibel zu halten (weil und obwohl es wegen des überhasteten "use strict" über alles richtig gerummst hat).

Aus meiner Sicht mehr zu kritisieren, ist die Existenz/Notwendigkeit der Funktion "DevIo_TimeoutRead" an sich.
Denn dieses busy-waiting auf irgendwas vom Device ist Gift für die Koexistenz mit anderen Instanzen von Modulen.
Für den timeout müsste mindestens eine (scharfe) Begrenzung rein, damit nutzende Modulentwickler gezwungen werden, sich was besseres, als die Nutzung dieser Funktion auszudenken, wenn eine Antwort vom Device länger als ein paar wenige ms dauern kann.
So gesehen sind solche fies versteckten Bugs in solchen unliebsamen Funktionen sogar positiv, denn der geneigte Nutzer wird vielleicht doch direkt einen besseren Pfad suchen, statt die Bugs in der Funktion zu suchen und zu beheben.  ;)

Nicht umsonst sind Module (eher Debugging Hilfen), wie 98_apptime.pm und 98_freezemon.pm mal entstanden, um u.a. busy-waiting Probleme mit anderen Modulen aufzudecken.
Und bei apptime lag der Fokus darauf, die Ungenauigkeiten und Rechenzeiten von FHEM Timern sichtbar zu machen und nicht darauf, einfach und narrensicher nutzbar zu sein.
Und apptime klinkt sich, mangels anderer Möglichkeiten, "schmutzig" aber pragmatisch durch Überschreiben von FHEM Systemfunktionen ins System ein, was eine Deiner Fragen eventuell beantwortet.

Vielen Dank für so manchen erklärenden Hinweis zu Perl. Das weckt Erinnerungen an viele Stunden des Grübelns über unerklärliches Verhalten von Perl Code. Und da kommen sicher noch einige hinzu, denn manchmal kann man gar nicht so krumm denken, wie Perl teilweise gestrickt ist.

Kannst Du eventuell was zu "Perl Internals Kenner könnten die Performance Unterschiede zwischen Funktionsnamen und Funktionsreferenzen aufzeichnen" beitragen?
Ich suche auch gerne (am liebsten technisch und nicht nur empirisch begründete) Mikrosekunden aber auch gerne Speicherplatz für das Eichhörnchen.

Gruß, Ansgar.
Titel: Antw:DevIo Bug
Beitrag von: KernSani am 17 April 2020, 18:02:19
Zitat von: noansi am 17 April 2020, 17:37:30
Und apptime klinkt sich, mangels anderer Möglichkeiten, "schmutzig" aber pragmatisch durch Überschreiben von FHEM Systemfunktionen ins System ein
Freezemon ist genauso schmutzig nur noch extensiver :-D


Gesendet von iPhone mit Tapatalk
Titel: Antw:DevIo Bug
Beitrag von: noansi am 17 April 2020, 19:44:30
Hallo Richard,

ok, ich weiß, es gehört nicht ganz hierher, aber hier habe ich Schreibrechte.

Du wendest hier https://forum.fhem.de/index.php/topic,109584.msg1039610.html#msg1039610 (https://forum.fhem.de/index.php/topic,109584.msg1039610.html#msg1039610) kompromisslos  return undef; -> return;  an, getreu PBP.

Wie prüfst Du automatisiert den Kontext in der Funktionsnutzung über den gesamten FHEM Code, um nicht auf so was https://perlmaven.com/how-to-return-undef-from-a-function (https://perlmaven.com/how-to-return-undef-from-a-function) unter "When implicit return breaks our code" reinzufallen?
Nicht, dass ich ein konkretes Beispiel in den FHEM Modulen wüßte, wo das zum tragen kommt. Aber genau diese Unsicherheit ist bedenkenswert, zumal noch wesentlich schwerer zu diagnostizierende Fehler rauskommen könnten, wie in diesem Thread?

Gruß, Ansgar.
Titel: Antw:DevIo Bug
Beitrag von: volschin am 18 April 2020, 09:11:37
Da ich im Developer Forum keine Schreibrechte habe, aber beruflich IT-Projekte mache, möchte ich hier mal sagen, dass ich es wohltuend finde, dass solche Diskussionen zur Codequalität, Sicherheit und entsprechende Maßnahmen jetzt endlich mal wahrnehmbar vorangetrieben werden. Die Denkweise, Hauptsache die Funktionalität ist für den User da, ist in den Zeiten von Angriffen über vernetzte Systeme nun mal leider von vorgestern. Fast jeder von uns nutzt irgendwo in seiner Installation einen Service aus dem Internet, der Daten bereitstellt oder auch mehr.

Danke und bitte nicht nachlassen.  :)
Titel: Antw:DevIo Bug
Beitrag von: rudolfkoenig am 18 April 2020, 09:42:15
Bitte keine Nebelkerzen: keiner wird wegen "no strict ref" oder perl WARNING Zugriff auf eine FHEM Installation kriegen, und Sicherheitsprobleme wurden auch bisher nicht mit hoher Prioritaet behandelt.
Titel: Antw:DevIo Bug
Beitrag von: volschin am 18 April 2020, 09:51:43
Da hofft man was Nettes zu sagen und wird gleich des Werfens von Nebelkerzen bezichtigt. Thats the old way.  ::)

Und die Sicherheit einer Anwendung besteht nicht darin, dass ich mich um Sicherheitprobleme nach ihrem offenbar werden kümmere. Ich gehe mal davon aus, dass Dir das "nicht" aus Versehen in den zweiten Halbsatz reingerutscht ist.  ;)
Titel: Antw:DevIo Bug
Beitrag von: rudolfkoenig am 18 April 2020, 10:31:47
ZitatUnd die Sicherheit einer Anwendung besteht nicht darin, dass ich mich um Sicherheitprobleme nach ihrem offenbar werden kümmere.
Das ist auch eine Unterstellung. CSRF habe ich eingefuehrt und viele Stunden Support geleistet, ohne dass jemand deswegen je ein Problem gemeldet hat. Das staendige Nerven von nicht gesetzten Passwort, oder das vereinfachte Umschalten auf HTTPS kam auch nicht, weil es eine Meldung gab. Das Pruefen auf non-local IP waere wegen den neuen Vorschlaegen auch nicht eher gekommen.

Ich erwaehne das, damit bei einem unbedarften Leser nicht der Eindruck entsteht, dass Sicherheitsaspekte bis jetzt vernachlaessigt wurden.
Titel: Antw:DevIo Bug
Beitrag von: volschin am 18 April 2020, 10:41:23
Rudolf, Du willst mich anscheinend falsch verstehen. Was ich sagen wollte war: Du hast von Sicherheitsproblemen geschrieben, Sicherheit beginnt für mich bei der Umsetzung von Coding Best Practices, die sich Leute mal ausgedacht haben um Anwendungen stabiler und sicherer zu machen. Und daher ist es schön, dass jetzt mal mit Perl::Critic draufgeschaut wird und zumindest die Sachen mit hoher Severity angegangen werden.
Titel: Antw:DevIo Bug
Beitrag von: rudolfkoenig am 18 April 2020, 11:17:48
ZitatSicherheit beginnt für mich bei der Umsetzung von Coding Best Practices
Stimmt, wir haben dann eine unterschiedliche Vorstellung von Sicherheit.
Vermutlich stammt deine Vorstellung daher, dass z.Bsp. im C mit Verwendung von snprintf bestimmte Sicherheitsprobleme vermieden werden koennen.
Mir ist nicht bekannt, dass perlcritic Fehler dieser Klasse findet.
Titel: Antw:DevIo Bug
Beitrag von: RichardCZ am 20 April 2020, 22:18:41
Zitat von: noansi am 17 April 2020, 17:37:30
Kannst Du eventuell was zu "Perl Internals Kenner könnten die Performance Unterschiede zwischen Funktionsnamen und Funktionsreferenzen aufzeichnen" beitragen?

Ich denke,

(*{$main::{$func_name}}{CODE})->(@args)

versus

$func_ref->(@args)

spricht eine ziemlich deutliche Sprache.




Zitat von: noansi am 17 April 2020, 19:44:30
Du wendest hier https://forum.fhem.de/index.php/topic,109584.msg1039610.html#msg1039610 (https://forum.fhem.de/index.php/topic,109584.msg1039610.html#msg1039610) kompromisslos  return undef; -> return;  an, getreu PBP.

Wie prüfst Du automatisiert den Kontext in der Funktionsnutzung über den gesamten FHEM Code

Gar nicht. Wer eine Funktion im List-Kontext aufruft ohne ein explizites "scalar" davor und erwartet, dass die Funktion sich diametral entgegengesetzt zu "wantarray" verhält: Darwin Award.

Zitat
Aber genau diese Unsicherheit ist bedenkenswert

Nicht für mich. Ich kann mir im HoBo Repository "mutig" erlauben. Noch ist diesbezüglich auch nix um die Ohren geflogen. Nicht dass ich am "um die Ohren fliegen" Mangel hätte.




Hinsichtlich Sicherheit ... da sind wir noch lange nicht. Irgendwelche lustigen Passwörter kann ich schon setzen, aber wenn ein Angreifer bei der Passworteingabe mal eben meinen beliebten "Krieg und Frieden" reinzünden darf, und FHEM auf einem System läuft mit Perl < 5.14 dann kann ich mir das Passwort auch in eine beliebige Körperöffnung stecken.

Aber egal, diese Diskussion werde ich jetzt weder anfangen, noch fortführen, weil es dafür viel zu früh ist. Noch gibt es keinen robusten Code (daran arbeite ich), noch gibt es nicht den Hauch von "tainted"-Sensitivität  (guggsu da: https://perldoc.perl.org/perlsec.html), noch gibt es explizite und vehemente Aversion gegen CVE advisories. Ich lade auch nicht mit einem Hubschrauber ein Tesla Model S auf Sentinel Island ab um den Einheimischen zu "helfen". Alles zu seiner Zeit.
Titel: Antw:DevIo Bug
Beitrag von: martinp876 am 30 Oktober 2021, 20:11:16
Hi, ich finden nun die Conclusio nicht. Ich will HMLAN einchecken und mit verweis auf diesen Threat wird es abgelehnt.

Wa muss ein IO Modul nun beachten um es einchecken zu können?
Titel: Antw:DevIo Bug
Beitrag von: rudolfkoenig am 30 Oktober 2021, 20:48:19
Statt "require $attr{global}{modpath}/FHEM/DevIo.pm" sollte man "use DevIo" verwenden.
Tut mir leid, wenn die Fehlermeldung nicht aussagekraeftig genug ist.
Titel: Antw:DevIo Bug
Beitrag von: martinp876 am 07 November 2021, 18:29:25
So weit war ich schon. use DevIo ist schon lange drin.
Dass ich das Reqiure ausbauen muss ist nicht klar.
=> mit use und ohne require geht es immer noch nicht.

das "use" steht nicht wie üblich am File-Anfang sondern im Initialize...
schwere Geburt... nach 20x Einchecken ist es nun drin.
danke